/* 连表-分组-窗口排序-选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