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
比仅仅获得每个类别的前 # 名更棘手。我想要每个艺术家每天每个国家/地区的前 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