Как найти максимальное количество вариантов за месяц в Postgres? - PullRequest
0 голосов
/ 16 марта 2020

Я хотел бы узнать максимальное количество вариантов тарифов за данный месяц для каждого из моих пользователей. Вот как выглядит моя таблица ставок:

Member  | Month     |   Rate
Joe     | Jan       |   1
Joe     | Jan       |   2
Joe     | Jan       |   3
Joe     | Feb       |   1
Joe     | Feb       |   2
Joe     | Feb       |   2
Joe     | Mar       |   1
Joe     | Mar       |   2
Joe     | Mar       |   2
Max     | Jan       |   1
Max     | Jan       |   1
Max     | Jan       |   1
Max     | Feb       |   2
Max     | Feb       |   2
Max     | Feb       |   2
Max     | Mar       |   3
Max     | Mar       |   3
Max     | Mar       |   3
Ben     | Jan       |   1
Ben     | Jan       |   2
Ben     | Jan       |   2
Ben     | Feb       |   1
Ben     | Feb       |   1
Ben     | Feb       |   1
Ben     | Mar       |   1
Ben     | Mar       |   1
Ben     | Mar       |   1

У Джо в январе для него доступны варианты ставок [1,2,3]. У Джо в феврале и марте всего два [1,2]. Для каждого пользователя я хотел бы отобразить максимальное количество доступных ставок за один месяц (по сравнению со всеми месяцами). Таблица результатов должна выглядеть следующим образом:

Member | Max rates in one month
Joe    | 3
Max    | 1
Ben    | 2

Как бы я написал этот запрос?

Ответы [ 2 ]

0 голосов
/ 16 марта 2020

Во-первых, вам нужно сгруппировать по члену и месяцу и подсчитать ставки:

SELECT "Member", "Month", count(*) AS n FROM rates GROUP BY 1,2;

Теперь, когда у вас есть количество ставок на члена в месяц, вы можете использовать результат для извлечения максимальное значение для каждого члена:

SELECT "Member", max(n) FROM (
    SELECT "Member", "Month", count(*) AS n FROM rates GROUP BY 1,2) X
 GROUP BY "Member";

Другие методы, использующие, например, оконные функции, но идея всегда одна и та же, и я думаю, что приведенный выше код проясняет, что происходит.

0 голосов
/ 16 марта 2020

Вы можете сделать это с некоторой агрегацией:

SELECT Member, MAX(rate_count) as "Max rates in one month"
FROM 
    (SELECT Member, Month, COUNT(DISTINCT RATE) rate_count FROM yourtable GROUP BY Member, Month) dt
GROUP BY Member;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...