-- 定义CTE临时表t1:筛选18-25岁用户在2022年播放周杰伦歌曲的记录
WITH t1 AS (
SELECT
play_log.fdate fdate,
play_log.user_id user_id,
song_info.song_name singer_name,
song_info.song_id song_id
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 BETWEEN 18 AND 25)
AND song_info.singer_name = '周杰伦'
AND YEAR(fdate) = 2022
),
-- 定义CTE临时表t2:按年月分组统计播放量并排名
t2 AS (
SELECT
DATE_FORMAT(fdate, '%y-%m') fddate,
singer_name,
COUNT(*) play_pv,
song_id,
ROW_NUMBER() OVER (
PARTITION BY DATE_FORMAT(fdate, '%y-%m')
ORDER BY COUNT(*) DESC, song_id
) rk
FROM t1
GROUP BY fddate, singer_name, song_id
)
-- 最终查询:提取每月前3名歌曲的播放数据
SELECT
CAST(RIGHT(fddate, 2) AS SIGNED) AS month,
rk ranking,
singer_name song_name,
play_pv
FROM t2
WHERE rk <= 3;