-- 定义CTE临时表t1:筛选18-25岁用户在2022年播放周杰伦歌曲的记录 WITH t1 AS ( SELECT play_log.fdate fdate, play_log.user_id user_id, song_info.song_name singer_name, song_info.song_id song_id FROM play_log JOIN song_info ON play_log.song_id = song_info.song_id JOIN user_info ON play_log.user_id = user_info.user_id WHERE (user_info.age BETWEEN 18 AND 25) AND song_info.singer_name = '周杰伦' AND YEAR(fdate) = 2022 ), -- 定义CTE临时表t2:按年月分组统计播放量并排名 t2 AS ( SELECT DATE_FORMAT(fdate, '%y-%m') fddate, singer_name, COUNT(*) play_pv, song_id, ROW_NUMBER() OVER ( PARTITION BY DATE_FORMAT(fdate, '%y-%m') ORDER BY COUNT(*) DESC, song_id ) rk FROM t1 GROUP BY fddate, singer_name, song_id ) -- 最终查询:提取每月前3名歌曲的播放数据 SELECT CAST(RIGHT(fddate, 2) AS SIGNED) AS month, rk ranking, singer_name song_name, play_pv FROM t2 WHERE rk <= 3;