SQL 刷题/【字节跳动】使用递归 CTE 统计播客片段传播链扩散质量
上一题下一题困难通过率 22%

【字节跳动】使用递归 CTE 统计播客片段传播链扩散质量

JOIN 连接聚合函数路径分析面试真题

题目描述

来源:字节跳动 SQL 面试真题

某音频内容平台会把播客节目的精彩片段剪成短音频,账号可以继续转发别人的分享链接,形成一棵“传播链”。运营团队想统计某个片段在指定时间范围内发起的每一条首发传播链的扩散质量。

本题使用 MySQL 8.0 语法,核心考点是 WITH RECURSIVE ... AS (...) 递归查询。

数据表

podcast_accounts 平台账号主数据表

字段类型说明
account_idBIGINT账号 ID,主键
account_nameVARCHAR(100)账号名称
account_roleVARCHAR(20)账号角色,例如 official、creator、listener
cityVARCHAR(50)账号所在城市
joined_atDATETIME账号注册时间

clip_share_events 播客片段分享事件表

字段类型说明
share_idBIGINT分享事件 ID,主键
clip_idBIGINT播客片段 ID
sharer_account_idBIGINT执行本次分享的账号 ID
parent_share_idBIGINT上游分享事件 ID;NULL 表示首发分享
share_timeDATETIME分享发生时间
play_secondsINT该分享链接带来的有效播放秒数

业务规则

  1. 一条传播链从 parent_share_id IS NULL 的首发分享开始。
  2. 下游分享满足 parent_share_id = 当前 share_id。
  3. 传播链需要递归向下展开,直到没有新的下游分享。
  4. 只统计 clip_id = 9001。
  5. 首发分享必须发生在 2025-07-01 00:00:00 到 2025-07-07 23:59:59 之间。
  6. 只要某条记录属于这些首发分享的递归下游,即使它自己的 share_time 超出上述时间范围,也要计入对应传播链。
  7. 传播链中没有子节点的分享事件是叶子节点;没有下游的首发分享本身也算 1 个叶子节点。

问题

请查询 clip_id = 9001 在指定首发时间范围内的每一条首发传播链,返回:

字段说明
root_share_id首发分享 ID
root_account_name首发账号名称
total_share_count传播链分享总数,包含首发节点
max_depth最大层级深度,首发节点深度为 0
leaf_share_count传播链中的叶子节点数量
distinct_account_count传播链中参与分享的不同账号数量
total_play_minutes所有节点 play_seconds 之和换算成分钟,四舍五入保留 2 位小数

结果按 max_depth 降序、distinct_account_count 降序、total_share_count 降序、root_share_id 升序排列。

数据样例

当前运行环境
account_idPKBIGINTaccount_nameVARCHAR(100)account_roleVARCHAR(20)cityVARCHAR(50)joined_atDATETIME
1晓声播客官方official杭州2024-01-10 08:00:00
2远方录音室creator上海2024-02-15 09:00:00
3星河听友listener北京2024-03-20 10:00:00
4山海编辑部creator广州2024-04-01 08:00:00
5林间耳机listener成都2024-05-06 11:00:00
6午后声音creator深圳2024-06-12 12:00:00
7夜航听友listener南京2024-07-18 13:00:00
输入数据显示 7 / 7
SQL 编辑器正在保存草稿...
正在加载 SQL 编辑器...

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