Sql 将团购与窗口功能相结合?
我正在尝试找出如何将GroupBy与窗口函数结合起来 我有野外作业Sql 将团购与窗口功能相结合?,sql,presto,Sql,Presto,我正在尝试找出如何将GroupBy与窗口函数结合起来 我有野外作业 timestamp track_name 其中时间戳表示播放曲目的时间 如果我想得到每天播放最多的曲目,我该怎么做 我需要一个按日期(时间戳)分组的曲目名称计数,以及曲目名称计数 但不知道如何按计数分组,然后在当天获得最多 thnx 您当然可以将分析函数与分组查询混合使用。在下面的查询中,我按日期和曲目名称进行聚合,但也基于聚合的计数生成排名。对于每个日期,将保留排名最高的曲目。请注意,我使用的是RANK而不是ROW\u N
timestamp track_name
其中时间戳表示播放曲目的时间
如果我想得到每天播放最多的曲目,我该怎么做
我需要一个按日期(时间戳)分组的曲目名称计数,以及曲目名称计数
但不知道如何按计数分组,然后在当天获得最多
thnx 您当然可以将分析函数与
分组查询混合使用。在下面的查询中,我按日期和曲目名称进行聚合,但也基于聚合的计数生成排名。对于每个日期,将保留排名最高的曲目。请注意,我使用的是RANK
而不是ROW\u 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;
这是因为分析函数是在groupby
完成后进行计算的。因此,COUNT(*)
可用于调用RANK()
谢谢,如果我不想将上述内容用作CTE,我可以使用实际的select dt,track\U name from(内部查询),其中rnk=1正确吗?作为子查询?@Chris90是的,您可以直接内联CTE,即do:SELECT dt,track_name FROM(…CTE…)as t,其中rnk=1
谢谢,我当时让它变得更难了,因为我似乎不知道如何在窗口中使用group by函数!答案没有问题,如果您还有其他要求,您可以等待其他答案。@Chris90否,如果您想按月份的日期进行排序,那么您可能应该使用orderbyday(dt)
。如果要按日期排序,只需使用orderbydt
。