WITH song_pv_ranked AS (
    SELECT
        MONTH(p.fdate) AS month,
        ROW_NUMBER() OVER (PARTITION BY MONTH(p.fdate) ORDER BY COUNT(*) DESC,s.song_id ASC) AS ranking,
        s.song_name,
        COUNT(*) as play_pv
    FROM
        play_log AS p
        INNER JOIN
        song_info AS s ON p.song_id=s.song_id
            INNER JOIN user_info AS u ON p.user_id=u.user_id
    WHERE
        s.singer_name = '周杰伦'
        AND u.age BETWEEN 18 AND 25
        AND YEAR(p.fdate) = 2022
    GROUP BY
        MONTH(p.fdate),
        s.song_id,
        s.song_name
)
SELECT
    *
FROM
    song_pv_ranked
WHERE
    ranking<=3
ORDER BY
    month,
    ranking;