【发布时间】:2020-07-06 17:41:58
【问题描述】:
我正在尝试弄清楚如何将 group by 与窗口函数结合起来
我有字段
timestamp track_name
其中时间戳表示曲目的播放时间。
如果我想获得每天播放次数最多的曲目,我该怎么做?
我需要 按日期(时间戳)和 track_name 分组的 track_name 计数
但不确定如何按计数分组,然后在当天获得最大收益?
谢谢!
【问题讨论】:
我正在尝试弄清楚如何将 group by 与窗口函数结合起来
我有字段
timestamp track_name
其中时间戳表示曲目的播放时间。
如果我想获得每天播放次数最多的曲目,我该怎么做?
我需要 按日期(时间戳)和 track_name 分组的 track_name 计数
但不确定如何按计数分组,然后在当天获得最大收益?
谢谢!
【问题讨论】:
您当然可以将分析函数与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;
这是可行的,因为分析函数在 GROUP BY 已经完成之后进行评估。因此,COUNT(*) 可用于对RANK() 的调用。
【讨论】:
SELECT dt, track_name FROM (...CTE...) AS t WHERE rnk = 1
ORDER BY DAY(dt)。如果您想按 日期 排序,则只需使用 ORDER BY dt。