select 
    sub.month,
    sub.ranking,
    sub.song_name,
    sub.play_pv
from(
    select
        month(p.fdate) as month,
        row_number() over (partition by month(p.fdate) order by count(*) desc, s.song_id asc) as ranking,
        s.song_name,
        count(*) as play_pv

    from
        play_log p
    join
        song_info s on s.song_id = p.song_id
    join
        user_info u on u.user_id = p.user_id
    where
        s.singer_name = '周杰伦'
        and u.age between 18 and 25
        and year(p.fdate) = 2022
    group by
        month(p.fdate), s.song_name, s.song_id

) as sub

where 
    sub.ranking <= 3
order by
    sub.month asc,
    play_pv desc;

  • 题目快速记住
  • 聚合函数和group by 一起使用
  • asc 升序,desc 降序
  • 构建子表 sub
  • 窗口函数 row_number over (parptition by 分类依据), order by 排序依据