select month, ranking, song_name, play_pv from ( SELECT MONTH (fdate) AS month, song_name, COUNT(*) AS play_pv, -- 使用 COUNT(*) 更准确 ROW_NUMBER() OVER ( PARTITION BY MONTH (fdate) ORDER BY COUNT(*) DESC, p.song_id ASC -- 直接使用 COUNT(*) ) AS ranking FROM user_info u LEFT JOIN play_log p ON u.user_id = p.user_id LEFT JOIN song_info s ON p.song_id = s.song_id WHERE YEAR (fdate) = 2022 AND age BETWEEN 18 AND 25 AND singer_name = '周杰伦' GROUP BY MONTH (fdate), song_name, p.song_id ) a where ranking<=3 order by month , ranking
首先 对三表连接 同时筛选条件 年龄,歌手,年号
在这张表基础上 对月 ,歌名,歌id分组
然后select 月份,歌名,歌名,分组排序求排名(按照月份分组,行数降序,歌曲id升序)
基于select 后组件新表 ,
最后再进行分组,对ranking帅选得到最后结果