select *
from (
    select fdate_month as month,
        row_number() over(partition by fdate_month order by count(song_name) desc,song_id asc) ranking,
        song_name,
        count(song_name) play_pv
    from (
        select month(pl.fdate) as fdate_month,
            pl.song_id,
            si.song_name
        from play_log as pl
        left join song_info as si on pl.song_id = si.song_id
        left join user_info as ui on ui.user_id = pl.user_id
        where (ui.age between 18 and 25)
        and year(pl.fdate) = '2022'
        and si.singer_name = '周杰伦'
        )a
    group by fdate_month,song_name,song_id
)b
where b.ranking <= 3