with tmp as 
(
    select
    month(t1.fdate) as month
    , row_number() over(partition by month(t1.fdate) order by count(t1.song_id) desc, t1.song_id asc) as ranking
    , t2.song_name
    , count(t1.song_id) as play_pv
    from play_log t1 left join song_info t2
    on t1.song_id = t2.song_id
    left join user_info u
    on t1.user_id = u.user_id
    where t2.singer_name = '周杰伦' and year(fdate) = 2022 and age >= 18 and age <= 25
    group by 
        month(t1.fdate)
        , t2.song_name
        , t1.song_id
)

select
    month
    , ranking
    , song_name
    , play_pv
from tmp
having ranking <= 3