【问题标题】:Combining a group buy with a window function?将团购与窗口功能相结合?
【发布时间】:2020-07-06 17:41:58
【问题描述】:

我正在尝试弄清楚如何将 group by 与窗口函数结合起来

我有字段

timestamp track_name 

其中时间戳表示曲目的播放时间。

如果我想获得每天播放次数最多的曲目,我该怎么做?

我需要 按日期(时间戳)和 track_name 分组的 track_name 计数

但不确定如何按计数分组,然后在当天获得最大收益?

谢谢!

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    您当然可以将分析函数与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() 的调用。

    【讨论】:

    • 谢谢,如果我不想将上面的内容用作 CTE,我可以使用实际的 select dt, track_name from (inner query) where rnk = 1 对吗?作为子查询?
    • @Chris90 是的,您可以只内联 CTE,即:SELECT dt, track_name FROM (...CTE...) AS t WHERE rnk = 1
    • 谢谢,我让它变得更难了,因为我不知道如何在窗口功能中使用 group by!
    • 答案没有问题,如果您还有其他要求,可以等待其他答案。
    • @Chris90 不,如果您想按月份本身的排序,那么您可能应该使用ORDER BY DAY(dt)。如果您想按 日期 排序,则只需使用 ORDER BY dt
    猜你喜欢
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2017-03-16
    • 2016-02-29
    • 2019-11-17
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多