SELECT
t.month,
t.ranking,
t.song_name,
t.play_pv
FROM
(SELECT
MONTH(p.fdate) AS month,
s.song_name,
COUNT(*) AS play_pv,
ROW_NUMBER() over (partition by MONTH(p.fdate) ORDER by COUNT(*) DESC, s.song_id ASC) AS ranking
FROM
play_log p
JOIN song_info s ON p.song_id=s.song_id
JOIN user_info u ON p.user_id=u.user_id
WHERE
u.age BETWEEN 18 AND 25
AND YEAR(p.fdate) = 2022
AND s.singer_name = '周杰伦'
GROUP BY
MONTH(p.fdate),s.song_name,s.song_id
) t
WHERE
t.ranking <= 3
ORDER BY
t.month ASC,
t.ranking ASC
- group by可以和窗口函数合用
- 想清楚是在哪个维度上压缩,哪个维度上保留。本题是在用户收听次数上压缩
- 用窗口函数时,每首歌的次数已经经过group聚合好,相同月份的条目中每首歌的记录只有一条,按照收听数排序就是在排序歌曲