【字节跳动】使用递归 CTE 统计播客片段传播链扩散质量
JOIN 连接聚合函数路径分析面试真题
题目描述
来源:字节跳动 SQL 面试真题
某音频内容平台会把播客节目的精彩片段剪成短音频,账号可以继续转发别人的分享链接,形成一棵“传播链”。运营团队想统计某个片段在指定时间范围内发起的每一条首发传播链的扩散质量。
本题使用 MySQL 8.0 语法,核心考点是 WITH RECURSIVE ... AS (...) 递归查询。
数据表
podcast_accounts 平台账号主数据表
| 字段 | 类型 | 说明 |
|---|---|---|
| account_id | BIGINT | 账号 ID,主键 |
| account_name | VARCHAR(100) | 账号名称 |
| account_role | VARCHAR(20) | 账号角色,例如 official、creator、listener |
| city | VARCHAR(50) | 账号所在城市 |
| joined_at | DATETIME | 账号注册时间 |
clip_share_events 播客片段分享事件表
| 字段 | 类型 | 说明 |
|---|---|---|
| share_id | BIGINT | 分享事件 ID,主键 |
| clip_id | BIGINT | 播客片段 ID |
| sharer_account_id | BIGINT | 执行本次分享的账号 ID |
| parent_share_id | BIGINT | 上游分享事件 ID;NULL 表示首发分享 |
| share_time | DATETIME | 分享发生时间 |
| play_seconds | INT | 该分享链接带来的有效播放秒数 |
业务规则
- 一条传播链从 parent_share_id IS NULL 的首发分享开始。
- 下游分享满足 parent_share_id = 当前 share_id。
- 传播链需要递归向下展开,直到没有新的下游分享。
- 只统计 clip_id = 9001。
- 首发分享必须发生在 2025-07-01 00:00:00 到 2025-07-07 23:59:59 之间。
- 只要某条记录属于这些首发分享的递归下游,即使它自己的 share_time 超出上述时间范围,也要计入对应传播链。
- 传播链中没有子节点的分享事件是叶子节点;没有下游的首发分享本身也算 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_idPKBIGINT | account_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 编辑器正在保存草稿...
Ctrl + Enter 运行
正在加载 SQL 编辑器...
运行你的 SQL 查询后,结果将显示在这里