Как найти идентификатор элемента, связанный с максимальным ресурсом по годам в SQL (postgres)? - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь выполнить SQL-запрос, который кажется простым, но я не понимаю, какой механизм мне следует использовать для достижения этой цели. У меня есть следующая таблица:

| id | playcount | release_date |
| -- | --------- | ------------ |
| 1  | 47712     | 2019-12-27   |
| 2  | 626778    | 2017-07-23   |
| 3  | 827091    | 2019-09-12   |
| 4  | 66419     | 2015-09-05   |
| 5  | 58627     | 2016-09-12   |
| 6  | 60272     | 2017-09-06   |
| 7  | 1762582   | 2017-10-07   |
| 8  | 11280     | 2016-10-12   |
| 9  | 30890     | 2019-10-29   |
| 10 | 715173    | 2019-07-02   |

Я хотел бы найти, какой идентификатор содержит максимум playcount в год. В этом примере идентификатор с максимальным значением playcount в 2019 году равен 3.

И я ищу следующий вывод:

playcount_table
| year | playcount | id |
| ---- | --------- | -- |
| 2019 | 827091    | 3  |
| 2017 | 1762582   | 7  |
| 2016 | 58627     | 5  |
| 2015 | 66419     | 4  |

Мне удалось получитьМаксимальное количество игр в год по следующему запросу:

select to_char(date_trunc('year', TO_DATE(p_table.release_date, 'YYYY-MM-DD')), 'YYYY-MM-DD') as year,
       max(p_table.playcount) as playcounts
from playcount_table as p_table
group by year;

Но я не могу получить id, относящийся к этому максимуму playcount.

Можете ли вы помочь мне с этим?

Заранее спасибо,

1 Ответ

2 голосов
/ 04 ноября 2019

Использование ROW_NUMBER:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY EXTRACT(year FROM release_date)
                                 ORDER BY playcount DESC) rn
    FROM playcount_table
)

SELECT
    EXTRACT(year FROM release_date) year
    playcount,
    id
FROM cte
WHERE
    rn = 1
ORDER BY
    EXTRACT(year FROM release_date) DESC;

Если в данном году две или более записей могут быть связаны с наибольшим количеством игр, и вы хотите сообщить о них обоих, то замените ROW_NUMBER вышес RANK.

Мы также можем использовать DISTINCT ON здесь:

SELECT DISTINCT ON (EXTRACT(year FROM release_date))
    EXTRACT(year FROM release_date),
    playcount,
    id
FROM playcount_table
ORDER BY
    EXTRACT(year FROM release_date),
    playcount DESC;
...