SQL:获取每个类别、每天、每个国家/地区的最高记录?

SQL: Get top records per category, per day, per country?

比仅仅获得每个类别的前 # 名更棘手。我想要每个艺术家每天每个国家/地区的前 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 个视频.. 我对如何实现这一目标感到困惑.. 我通常在 window 函数方面遇到困难,因此我将不胜感激。

我正在使用 Amazon Redshift

谢谢

这将对每个艺术家每天的观看次数进行排名,并显示每个艺术家每天的两个视图

    Select * 
    From 
   (
    Select t2.*, ROW_NUMBER() over(partition by artist, day, country order by views desc) as rn
    From t1  t2
    )
Where rn <= 2

您需要按您提到的所有列进行分区,因为您是在这些元素的每个组合中对视图进行排名。 因为您已将聚合列重命名为 "views",所以您需要使用该名称来调用它。 最后,如果你想要top 2videos/songs,使用这个条件:where 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