【字节跳动】使用递归 CTE 追溯宠物猫后代健康指数
JOIN 连接路径分析面试真题
题目描述
来源:字节跳动 SQL 面试真题
某大型宠物繁育协会记录了注册宠物猫的基本信息和繁育后代。近期发现一只名为 Luna 的母猫携带某种隐性遗传病基因,协会需要追溯 Luna 的所有直系后代,包括子女、孙辈和曾孙辈等,并计算每只后代的综合健康评估指数。
数据表
cats 宠物猫信息表
| 字段 | 类型 | 说明 |
|---|---|---|
| cat_id | INT | 宠物猫注册编号,主键 |
| cat_name | VARCHAR(64) | 宠物猫呼名 |
| breed | VARCHAR(64) | 宠物猫品种 |
breeding_records 繁育记录表
| 字段 | 类型 | 说明 |
|---|---|---|
| parent_cat_id | INT | 父母猫注册编号 |
| child_cat_id | INT | 子代猫注册编号 |
| birth_date | DATE | 子代猫出生日期 |
| health_score | FLOAT | 子代猫出生时的健康评分,满分 100 |
业务规则
- 只统计 birth_date 在 2025-01-01 至 2025-12-31 之间的繁育关系,包含首尾两日。
- 递归链路上的每一条繁育记录都必须满足日期条件。如果中间某一代不在 2025 年出生,该关系及其后续分支都不能进入结果。
- Luna 的直接子女 generation = 1,孙辈 generation = 2,依此类推。
- composite_index = health_score × 0.95^generation。
- composite_index 四舍五入保留 2 位小数。
输出要求
查询由名为 Luna 的宠物猫繁育出的所有直接和间接后代,输出:
| 字段 | 说明 |
|---|---|
| descendant_id | 后代猫注册编号 |
| descendant_name | 后代猫呼名 |
| generation | 世代代数,直接子女为 1 |
| composite_index | 综合健康评估指数,四舍五入保留 2 位 |
排序规则:
- generation 升序。
- composite_index 降序。
- descendant_id 升序。
数据样例
| cat_idPKINT | cat_nameVARCHAR(64) | breedVARCHAR(64) |
|---|---|---|
| 1 | Luna | 布偶猫 |
| 2 | Milo | 布偶猫 |
| 3 | Nala | 布偶猫 |
| 4 | Coco | 缅因猫 |
| 5 | Leo | 英短 |
| 6 | Mimi | 布偶猫 |
| 7 | Simba | 缅因猫 |
| 8 | Oscar | 英短 |
输入数据显示 8 / 10 行
SQL 编辑器正在保存草稿...
Ctrl + Enter 运行
正在加载 SQL 编辑器...
运行你的 SQL 查询后,结果将显示在这里