-- 问题提炼:18-25岁用户 在2022年 周杰伦的歌曲 每个月播放次数top 3 -- ORDER BY COUNT(s.song_name) DESC: -- 对当前分区(即当前月份)内的每首歌曲的播放记录数量进行统计,播放次数多的歌曲会排在前面 WITH t AS ( SELECT MONTH(p.fdate) AS `month` ,ROW_NUMBER() OVER(PARTITION BY MONTH(p.fdate) ORDER BY COUNT(s.song_name) DESC, p.song_id ASC) AS ranking ,s.song_name ,COUNT(s.song_name) AS play_pv FROM play_log p LEFT JOIN song_info s ON p.song_id = s.song_id LEFT JOIN user_info u ON p.user_id = u.user_id WHERE YEAR(p.fdate) = 2022 -- 在2022年 AND u.age BETWEEN 18 AND 25 -- 18-25岁用户 AND s.singer_name = '周杰伦' -- 周杰伦的歌曲 GROUP BY MONTH(p.fdate), s.song_name, p.song_id -- 窗口函数中用到song_id,所以分组时要加上 ) SELECT * FROM t WHERE ranking <= 3 -- 每个月播放次数top 3 ;
题目要求:
关联3张表:
根据 题目要求 和 关联3张表的结果,差ranking和play_pv字段,分组,开窗,然后统计即可。
END