SQL 刷题/【网易】按首发时段统计歌手新歌听众回流
上一题下一题困难通过率 100%

【网易】按首发时段统计歌手新歌听众回流

JOIN 连接聚合函数GROUP BYCASE WHEN日期函数用户行为分析面试真题

题目描述

来源:网易 SQL 面试真题

某音乐流媒体平台希望分析独立音乐人新歌发布效果:

每当一首新歌在某位歌手的主页首发上线,团队会关注首发当日完整听完该新歌的听众,在接下来的 D+1、D+3、D+7 日是否还在该歌手的任意歌曲下继续产生完整收听。

数据表

t_song 歌曲表

字段类型说明
song_idBIGINT歌曲 ID
artist_idBIGINT歌手 ID
song_nameVARCHAR(64)歌曲名
duration_secINT歌曲总时长(秒)
release_timeDATETIME首发上线时间

t_play 收听流水表

字段类型说明
play_idBIGINT收听记录 ID
user_idBIGINT用户 ID
song_idBIGINT歌曲 ID,关联 t_song.song_id
play_startDATETIME开始收听时间
play_secINT实际收听秒数

业务规则

首发完听用户

对每首新歌,首发日为 DATE(release_time)。定位首发日当天收听该新歌的用户:

  • 至少有一条 play_sec ≥ duration_sec 的记录。
  • 同一用户对同一首新歌只形成一个“用户 × 新歌”组合。
  • 同一用户在多首新歌的首发日都完听时,可以分别计入各首新歌和歌手的基数。

首发时段

对每个“首发完听用户 × 新歌”组合,取该用户当天对该新歌的最早 play_start:

  • morning:06:00:00~11:59:59
  • afternoon:12:00:00~17:59:59
  • night:18:00:00~23:59:59 或 00:00:00~05:59:59

回流判定

回流是指该用户在目标日期当天,对同一歌手的任意歌曲产生至少一次完整收听:

  • D+1:首发日之后 1 个日历日
  • D+3:首发日之后 3 个日历日
  • D+7:首发日之后 7 个日历日

同一歌手同日有多首新歌首发时,各首新歌分别判定;同一用户可以被多次计入基数。

输出要求

输出歌手 × 首发时段的回流矩阵,仅保留 base_user_cnt > 0 的行。

字段说明
artist_id歌手 ID
time_slotmorning / afternoon / night
base_user_cnt该歌手该时段的首发完听用户基数,即用户 × 新歌组合数
d1_rateD+1 回流率,四舍五入保留 2 位小数
d3_rateD+3 回流率,四舍五入保留 2 位小数
d7_rateD+7 回流率,四舍五入保留 2 位小数

排序规则

  1. d7_rate 降序。
  2. base_user_cnt 降序。
  3. artist_id 升序。
  4. time_slot 按 morning、afternoon、night 的固定顺序。

数据样例

当前运行环境
song_idPKBIGINTartist_idBIGINTsong_nameVARCHAR(64)duration_secINTrelease_timeDATETIME
1011new dawn2002025-03-01 09:00:00
1021second light1802025-03-01 17:00:00
1031catalog track a2402025-01-15 10:00:00
2012ocean signal3002025-03-05 13:00:00
2022deep current2402025-03-05 18:00:00
2032catalog track b2202025-01-10 10:00:00
输入数据显示 6 / 6
SQL 编辑器正在保存草稿...
正在加载 SQL 编辑器...

运行你的 SQL 查询后,结果将显示在这里