WITH
t1 AS (
SELECT      -- 清洗数据,获取2022年18~25岁用户每个月每首周杰伦歌曲的播放次数
    MONTH(a.fdate) AS month,
    b.song_id,
    b.song_name,
    COUNT(*) AS play_pv
FROM play_log AS a
INNER JOIN song_info AS b
    ON a.song_id = b.song_id
    AND b.singer_name = '周杰伦'
INNER JOIN user_info AS c
    ON a.user_id = c.user_id
    AND c.age >= 18 AND c.age <= 25
WHERE a.fdate >= '2022-01-01' AND a.fdate < '2023-01-01'
GROUP BY MONTH(a.fdate),b.song_name,b.song_id
),

t2 AS (
SELECT      -- 用窗口函数对每个月每首歌的播放次数进行降序
    month,
    RANK() OVER(PARTITION BY month ORDER BY play_pv DESC,song_id) AS ranking,
    song_name,
    play_pv
FROM t1
)

SELECT      -- 主查询,只显示每个月播放次数top 3的歌曲信息
    month,
    ranking,song_name,play_pv
FROM t2
WHERE ranking <= 3
ORDER BY month,ranking,song_name