select
    month,ranking,song_name,play_pv
from
    (
        select
            month,
            row_number() over (
                partition by
                    month
                order by
                    play_pv desc,song_id
            ) as ranking,
            song_name,
            play_pv
        from
            (
                select
                    month (fdate) as month,
                    song_name,
                    song_id,
                    count(1) as play_pv
                from
                    play_log
                    join song_info using (song_id)
                    join user_info using (user_id)
                where
                    singer_name = '周杰伦'
                    and age between 18 and 25
                group by
                    1,2,3
            ) t1
       ) t2
where
    ranking <= 3