- 有一张网易云用户播放歌曲全量表dwd_usr_play_song_dd,包含uid(用户id)、singer(歌手名称)、song_name(歌曲名称)、sdate(播放日期)
- 注意:同一个用户同一首歌每天播放多次,仅存放一次
- 问题:计算2024年每个月播放次数TOP3的陈奕迅的歌曲
-- 举例如下:
-- 输入
-- dwd_usr_play_song_dd
uid singer song_name sdate
1001 陈奕迅 十年 20241011
1002 陈奕迅 十年 20241011
1003 陈奕迅 十年 20241011
1004 陈奕迅 十年 20241011
1001 陈奕迅 富士山下 20241011
1002 陈奕迅 好久不见 20241011
1003 陈奕迅 好久不见 20241011
1004 陈奕迅 好久不见 20241011
1003 陈奕迅 单车 20241011
1004 陈奕迅 单车 20241011
-- 输出
month song_name rk
10 十年 1
10 好久不见 2
10 单车 3
1.模拟数据:
sql
create table dwd_usr_play_song_dd (
uid string(20),
singer string(20),
song_name string(20),
sdate string(20)
);
INSERT INTO dwd_usr_play_song_dd VALUES
('1001','陈奕迅','十年','20241011'),
('1002','陈奕迅','十年','20241011'),
('1003','陈奕迅','十年','20241011'),
('1004','陈奕迅','十年','20241011'),
('1001','陈奕迅','富士山下','20241011'),
('1002','陈奕迅','好久不见','20241011'),
('1003','陈奕迅','好久不见','20241011'),
('1004','陈奕迅','好久不见','20241011'),
('1003','陈奕迅','单车','20241011'),
('1004','陈奕迅','单车','20241011');
2.思路分析
- 问题如果看起来比较复杂,那么可以将问题进行如下拆解:
- 维度:月份、歌曲
- 事实:播放次数
- 过滤条件:播放时间为2024年、歌手为陈奕迅
- 首先计算每个月每首歌播放的次数,然后按照月份进行分组,播放次数进行排名,求出每个月前三名的播放歌曲即可。
1、先获取每一首歌曲的播放次数:
sql
select song_name,count(1) playNum from dwd_usr_play_song_dd where singer='陈奕迅' and substr(sdate,0,4) = '2024'
group by song_name;
2、接着根据排名函数进行排名过滤:
sql
with t as (
select substr(sdate,5,2) `month`,song_name,count(1) playNum from dwd_usr_play_song_dd where singer='陈奕迅' and substr(sdate,0,4) = '2024'
group by substr(sdate,5,2),song_name
),t2 as (
select * ,dense_rank() over (order by playNum desc) pm from t
)
select * from t2 where pm <= 3;