Объединить групповую покупку с оконной функцией? - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь выяснить, как объединить группу с помощью оконной функции

У меня есть поле как

timestamp track_name 

, где отметка времени представляет время воспроизведения дорожки.

Если я хочу получить трек, который воспроизводился чаще всего каждый день, как я могу это сделать?

Мне понадобится счетчик track_name, сгруппированный по дате (timestamp), и track_name

но не знаете, как это сгруппировать по количеству, а затем получить максимум за этот день?

thnx!

1 Ответ

1 голос
/ 26 марта 2020

Вы, безусловно, можете смешивать аналитические функции c с запросом GROUP BY. В приведенном ниже запросе я агрегирую по дате и названию трека, но также генерирую рейтинг на основе агрегированного количества. Для каждой даты сохраняется дорожка с наивысшим рейтингом. Обратите внимание, что я использую RANK, а не ROW_NUMBER, так как первый может обрабатывать возможность связывания двух или более треков для наибольшего количества воспроизведений за один день.

WITH cte AS (
    SELECT DATE(timestamp) AS dt, track_name,
        RANK() OVER (PARTITION BY DATE(timestamp) ORDER BY COUNT(*) DESC) rnk
    FROM yourTable
    GROUP BY DATE(timestamp), track_name
)

SELECT dt, track_name
FROM cte
WHERE rnk = 1;

Это работает, потому что Функции analyti c оцениваются после того, как GROUP BY уже завершено. Таким образом, COUNT(*) доступен для использования при вызове RANK().

...