自学内容网 自学内容网

网易SQL面试题

  • 有一张网易云用户播放歌曲全量表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.模拟数据: 

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、先获取每一首歌曲的播放次数:

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、接着根据排名函数进行排名过滤:

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;


原文地址:https://blog.csdn.net/m0_56341622/article/details/143579491

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!