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帅选得到最后结果

京公网安备 11010502036488号