select * from(
select month(play_log.fdate) as month,row_number() over (partition by month(play_log.fdate) order by count(play_log.song_id) desc,play_log.song_id)as ranking,
song_info.song_name,count(play_log.song_id) as play_pv
from play_log join song_info on play_log.song_id=song_info.song_id
join user_info on play_log.user_id = user_info.user_id
where user_info.age>=18 and user_info.age<=25
and song_info.singer_name="周杰伦"
and year(play_log.fdate)=2022
group by month(play_log.fdate),song_info.song_name,play_log.song_id) a where a.ranking<=3
- top3可以通过子查询表示;
- 非并列的排序用row_number() over (partition by xxx order by xx),order by 后面加了play_log.song_id是因为同次序按照song_id排序---这也是为什么2/3组用例通过
- where条件不要遗漏周杰伦和2022年
- group by后不能加自命名,要加song_info.song_name,play_log.song_id是因为非聚合列都要加到group by后,否则没法按照非聚合列进行聚合