[英]How to apply group by here?
我有一個包含Movie
和Viewer
列的 Movie 表,其中任何用戶都可以多次觀看每部電影,因此該表可以有多個相同的條目。 我想找到前 N 部觀看次數最多的電影,然后是每部前 N 部電影的前 K 名觀眾。 在這種情況下如何有效地應用分組依據或分區依據? 或者如果有更好的方法,請分享。 謝謝!
電影 | 用戶 |
---|---|
復仇者聯盟 | 約翰 |
蝙蝠俠 | 克里斯 |
蝙蝠俠 | 羅恩 |
X戰警 | 克里斯 |
X戰警 | 羅恩 |
矩陣 | 約翰 |
蝙蝠俠 | 馬丁 |
矩陣 | 克里斯 |
蝙蝠俠 | 克里斯 |
X戰警 | 羅恩 |
所以,在這張表中,蝙蝠俠是觀看次數最多的電影是蝙蝠俠,其次是 X 戰警,所以我希望結果表看起來像:
電影 | 用戶 | 查看次數 |
---|---|---|
蝙蝠俠 | 克里斯 | 2個 |
蝙蝠俠 | 羅恩 | 1個 |
蝙蝠俠 | 馬丁 | 1個 |
X戰警 | 羅恩 | 2個 |
X戰警 | 克里斯 | 1個 |
矩陣 | 約翰 | 1個 |
矩陣 | 克里斯 | 1個 |
復仇者聯盟 | 約翰 | 1個 |
我知道我可以按電影分組,然后按 count(*) desc 進行排序,但這並沒有給我第二列,它是按觀眾分組的,也沒有給我每個觀眾的計數。
考慮以下方法(假設 Top 3 電影有 Top 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
如果應用於您問題中的示例數據 - output 是
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.