Получение 40% лучших продаж от пользователей - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть таблица, в которой есть столбцы date, user_id, sales_amount. Пример таблицы приведен ниже:

+------------+---------+--------------+
|    date    | user_id | sales_amount |
+------------+---------+--------------+
| 2020-01-01 | 1       | 27           |
| 2020-01-01 | 2       | 32           |
| 2020-01-01 | 3       | 17           |
| 2020-01-03 | 1       | 19           |
| 2020-01-03 | 2       | 18           |
| 2020-01-03 | 3       | 40           |
| …………..     | …………..  | …………..       |
| …………..     | …………..  | …………..       |
| …………..     | …………..  | …………..       |
+------------+---------+--------------+

Я хочу получить 40% продаж от пользователей. Я бы использовал что-то вроде SELECT TOP 40 PERCENT users после агрегации. Но я не использую сервер MS- SQL, поэтому этот метод неприменим.

Я знаю следующее:

Сначала получите количество строк из запроса ниже

SELECT MAX(Rn) AS number_of_rows

FROM(

SELECT *,row_number() OVER(ORDER BY Amt DESC) as Rn

FROM 
(SELECT user_id, SUM(AMOUNT) AS Amt
FROM table
GROUP BY user_id) A ) B

Второй рассчитать 40% вышеуказанного значения и получить пользователей

SELECT *
FROM

(SELECT *,row_number() OVER(ORDER BY Amt DESC) as Rn

FROM 
(SELECT user_id, SUM(AMOUNT) AS Amt
FROM table
GROUP BY user_id) A ) B

WHERE Rn <= 0.4* (number_of_rows)

Выше два шага могут быть объединены, как показано ниже

SELECT *
FROM

(SELECT *,row_number() OVER(ORDER BY Amt DESC) as Rn

FROM 
(SELECT user_id, SUM(AMOUNT) AS Amt
FROM table
GROUP BY user_id) A ) B

WHERE Rn <= 0.4 * (SELECT MAX(Rn) AS number_of_rows

FROM(

SELECT *,row_number() OVER(ORDER BY Amt DESC) as Rn

FROM 
(SELECT user_id, SUM(AMOUNT) AS Amt
FROM table
GROUP BY user_id) A ) B)

Есть ли какой-нибудь оптимальный способ / встроенная функция для получения этого в улье?

1 Ответ

1 голос
/ 05 апреля 2020

Да! Вы можете сделать оба за один шаг:

SELECT u.*
FROM (SELECT user_id, SUM(AMOUNT) as amt,
             ROW_NUMBER() OVER (ORDER BY SUM(AMOUNT) DESC) as seqnum,
             COUNT(*) OVER () as cnt

      FROM t
      GROUP BY user_id
     ) u
WHERE seqnum <= cnt * 0.4;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...