/*
连表-分组-窗口排序-选ranking < 4基本就是这个套路
逆天的是题目没有说明排序条件......

首先看输出案例,先按month, ranking,pv排是没有问题
关键最后pv一样的话按什么排?按song_name asc和desc都不行,那只有按song_id排序了(因为是要对歌曲排序)
*/
select
    month_ as month,
    ranking,
    song_name,
    pv as play_pv 
from
    (
        select
            month_,
            row_number() over(partition by month_ order by pv desc, song_id) as ranking,
            song_name,
            pv
        from
            ( 
                select
                    s.song_id,
                    month(fdate) as month_,
                    song_name,
                    count(*) as pv
                from 
                    song_info as s
                    inner join play_log as p on s.song_id=p.song_id
                    and year(fdate)=2022 and singer_name="周杰伦" 
                    and exists(
                        select 1
                        from user_info
                        where user_info.user_id=p.user_id and user_info.age between 18 and 25
                    )
                group by 
                    month(fdate), song_name, s.song_id  
            ) as grouped_tb
    ) as ranking_tb
where ranking < 4
order by month, ranking