这里如何申请group by?

How to apply group by here?

我有一部包含 MovieViewer 列的 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     

如果应用于您问题中的示例数据 - 输出为