Функции Agg при разделении данных в SQL - PullRequest
0 голосов
/ 07 августа 2020

У меня есть таблица, которая выглядит так:

store_id   industry_id   cust_id   amount   gender
1          100           1000      1.00     M
2          100           1000      2.05     M
3          100           1000      3.15     M
4          100           1000      4.00     M
5          100           2000      5.00     F
6          200           2000      5.20     F
7          200           5000      6.05     F
8          200           6000      7.10     F

Вот код для создания этой таблицы:

CREATE TABLE t1(
    store_id int,
    industry_id int,
    cust_id int,
    amount float,
    gender char
);
INSERT INTO t1 VALUES(1,100,1000,1.00, 'M');
INSERT INTO t1 VALUES(2,100,1000,2.05, 'M');
INSERT INTO t1 VALUES(3,100,1000,3.15, 'M');
INSERT INTO t1 VALUES(4,100,1000,4.00, 'M');
INSERT INTO t1 VALUES(5,100,2000,5.00, 'F');
INSERT INTO t1 VALUES(6,200,2000,5.20, 'F');
INSERT INTO t1 VALUES(7,200,5000,6.05, 'F');
INSERT INTO t1 VALUES(8,200,6000,7.10, 'F');

Вопрос, на который я пытаюсь ответить: Что такое средн. сумма транзакции для 20% лучших клиентов по отрасли?

Это должно дать следующие результаты:

store_id.     industry_id      avg_amt_top_20
1             100              4.80
2             100              4.80
3             100              4.80
4             100              4.80
5             100              4.80
6             200              7.10
7             200              7.10
8             200              7.10

Вот что у меня есть на данный момент:

SELECT
store_id, industry_id,
avg(CASE WHEN percentile>=0.80 THEN amount ELSE NULL END) OVER(PARTITION BY industry_id)  as cust_avg
FROM(
    SELECT store_id, industry_id, amount, cume_dist() OVER(
        PARTITION BY industry_id 
        ORDER BY amount desc) AS percentile 
    FROM t1
) tmp
GROUP BY store_id, industry_id;

Это не удается для GROUP BY (содержит неагрегированный столбец «количество»). Как лучше всего это сделать?

1 Ответ

1 голос
/ 07 августа 2020

Какая средн. сумма транзакции для 20% лучших клиентов по отрасли?

На основании этого вопроса я не понимаю, почему store_id отображается в результатах.

Если я правильно понимаю , вам нужно агрегировать, чтобы получить общую сумму по клиентам. Затем вы можете использовать NTILE(), чтобы определить верхние 20%. Последний шаг - агрегирование по отраслям:

SELECT industry_id, AVG(total)
FROM (SELECT customer_id, industry_id, SUM(amount) as total,
             NTILE(5) OVER (PARTITION BY industry_id ORDER BY SUM(amount) DESC) as tile
      FROM t
      GROUP BY customer_id, industry_id
     ) t
WHERE tile = 1
GROUP BY industry_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...