将团购与 window 功能结合起来?
Combining a group buy with a window function?
我正在尝试弄清楚如何将分组依据与 window 函数组合
我的字段为
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()
。
我正在尝试弄清楚如何将分组依据与 window 函数组合
我的字段为
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()
。