这里如何申请group by?
How to apply group by here?
我有一部包含 Movie
和 Viewer
列的 table 电影,其中每部电影都被任何用户观看了任意次数,因此 table 可以有多个相同的条目。我想找到前 N 部观看次数最多的电影,然后是每部前 N 部电影的前 K 名观众。在这种情况下如何有效地应用 group by 或 partition by ?或者如果有更好的方法,请分享。谢谢!
Movie
User
Avengers
John
Batman
Chris
Batman
Ron
X-Men
Chris
X-Men
Ron
Matrix
John
Batman
Martin
Matrix
Chris
Batman
Chris
X-Men
Ron
所以,在这个 table 中,蝙蝠侠是观看次数最多的电影是蝙蝠侠,其次是 X 战警,所以我希望结果 table 看起来像:
Movie
User
View count
Batman
Chris
2
Batman
Ron
1
Batman
Martin
1
X-Men
Ron
2
X-Men
Chris
1
Matrix
John
1
Matrix
Chris
1
Avengers
John
1
我知道我可以按电影分组,然后按计数 (*) desc 排序,但这并没有给我第二列,它按观众分组,也没有给我每个观众的计数。
考虑以下方法(假设前 3 部电影有前 2 名用户)
select movie, user, view_count
from (
select distinct *,
count(*) over(partition by movie) movie_views,
count(*) over(partition by movie, user) view_count
from your_table
)
qualify dense_rank() over(order by movie_views desc) <=3
and row_number() over(partition by movie order by view_count desc) <=2
-- order by movie_views desc, view_count desc
如果应用于您问题中的示例数据 - 输出为
我有一部包含 Movie
和 Viewer
列的 table 电影,其中每部电影都被任何用户观看了任意次数,因此 table 可以有多个相同的条目。我想找到前 N 部观看次数最多的电影,然后是每部前 N 部电影的前 K 名观众。在这种情况下如何有效地应用 group by 或 partition by ?或者如果有更好的方法,请分享。谢谢!
Movie | User |
---|---|
Avengers | John |
Batman | Chris |
Batman | Ron |
X-Men | Chris |
X-Men | Ron |
Matrix | John |
Batman | Martin |
Matrix | Chris |
Batman | Chris |
X-Men | Ron |
所以,在这个 table 中,蝙蝠侠是观看次数最多的电影是蝙蝠侠,其次是 X 战警,所以我希望结果 table 看起来像:
Movie | User | View count |
---|---|---|
Batman | Chris | 2 |
Batman | Ron | 1 |
Batman | Martin | 1 |
X-Men | Ron | 2 |
X-Men | Chris | 1 |
Matrix | John | 1 |
Matrix | Chris | 1 |
Avengers | John | 1 |
我知道我可以按电影分组,然后按计数 (*) desc 排序,但这并没有给我第二列,它按观众分组,也没有给我每个观众的计数。
考虑以下方法(假设前 3 部电影有前 2 名用户)
select movie, user, view_count
from (
select distinct *,
count(*) over(partition by movie) movie_views,
count(*) over(partition by movie, user) view_count
from your_table
)
qualify dense_rank() over(order by movie_views desc) <=3
and row_number() over(partition by movie order by view_count desc) <=2
-- order by movie_views desc, view_count desc
如果应用于您问题中的示例数据 - 输出为