首页 > 解决方案 > SQL:获取每个类别、每天、每个国家的最高记录?

问题描述

比仅获得每个类别的顶部 # 有点棘手。我想要每个艺术家、每个国家/地区每天的前 2 个视频。

我的代码没有给我正确的结果是:

    Select * 
    From 
   (
    Select t2.*, dense_rank() over(partition by artist order by views desc)
    From
      (select country, day, artist, song, sum(view) as views
        From t1 
        Group by 1,2,3,4
        ) t2
    )
Where rn >=5 

样本数据结果

| Country | Date | artist   | video | views | rn |
|---------|------|----------|-------|-------|----|
| US      | Jan1 | Beyonce  | ab    | 100   | 1  |
| US      | Jan1 | Beyonce  | ac    | 99    | 2  |
| US      | Jan2 | C. Brown | ad    | 89    | 1  |
| US      | Jan2 | C. Brown | ai    | 103   | 2  |
| AU      | Jan1 | Beyonce  | bf    | 99    | 1  |
| AU      | Jan1 | Beyonce  | bb    | 89    | 2  |

我希望每个国家每天都有所有艺术家,但每个艺术家只有 10 个视频。我对如何实现这一点有点困惑。我通常在窗口功能方面遇到困难,所以我会很感激任何帮助。

我正在使用 Amazon Redshift

谢谢

标签: sqloracleamazon-redshiftdense-rank

解决方案


您需要按您提到的所有列进行分区,因为您在这些元素的每个组合中对视图进行排名。因为您已将聚合列重命名为“视图”,所以您需要使用该名称来调用它。最后,如果您想要排名前 2 的视频/歌曲,请使用以下条件:其中 rn <= 2

   Select * 
    From 
   (
    Select t2.*, dense_rank() over(partition by country, day, artist order by views desc)
    From
      (select country, day, artist, song, sum(views) as views
        From t1 
        Group by 1,2,3,4
        ) t2
    )
Where rn <= 2

推荐阅读