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