【携程】识别贡献前 80% 营收的核心营位
JOIN 连接聚合函数窗口函数CASE WHEN日期函数营收统计排行榜面试真题
题目描述
来源:携程 SQL 面试真题
某网红连锁露营地在 2025 年旺季结束后进行经营复盘。总部希望按照帕累托法则,识别真正支撑营收的核心营位。
只考虑 check_in 在 2025-04-01 至 2025-09-30 之间的预订。
实际入账规则
| weather | 实际入账比例 |
|---|---|
| sunny / cloudy | 100% |
| light_rain | 70% |
| heavy_rain | 50% |
| storm | 0% |
核心营位定义
- 先按营位汇总旺季实际入账。
- 按 actual_revenue 降序排列;实际入账相同时,按 site_id 升序排列。
- 从上到下累计实际入账。
- 当且仅当累加到本行之前的累计入账仍小于总入账的 80% 时,该营位属于核心营位。
因此,首次使累计占比达到或超过 80% 的营位也必须包含;当前一行累计占比已经达到 80% 时,后续营位不再属于核心营位。
数据表
t_camp_site 营位档案表
| 字段 | 类型 | 说明 |
|---|---|---|
| site_id | BIGINT | 营位编号 |
| site_name | VARCHAR(64) | 营位名称 |
| site_type | VARCHAR(16) | 住宿类型:tent / cabin / rv / canopy |
| capacity | TINYINT | 最大容纳人数 |
| daily_price | DECIMAL(7,2) | 每晚定价 |
| region | VARCHAR(32) | 所在片区 |
t_booking 预订记录表
| 字段 | 类型 | 说明 |
|---|---|---|
| booking_id | BIGINT | 预订编号 |
| site_id | BIGINT | 营位编号,关联 t_camp_site.site_id |
| guest_phone | VARCHAR(16) | 住客手机号 |
| check_in | DATE | 入住日期 |
| check_out | DATE | 离营日期,严格大于 check_in |
| party_size | TINYINT | 实际入住人数 |
| weather | VARCHAR(16) | 整体天气 |
| paid_amount | DECIMAL(8,2) | 客人预付总金额 |
输出字段
| 字段 | 说明 |
|---|---|
| site_id | 营位编号 |
| site_name | 营位名称 |
| site_type | 住宿类型 |
| region | 所在片区 |
| booking_cnt | 旺季内预订单数 |
| total_nights | 旺季内总入住晚数,每单按 check_out - check_in 计算 |
| actual_revenue | 按天气加权后的实际入账总额,四舍五入保留 2 位 |
| cumulative_revenue | 按指定顺序计算的含本行累计入账,保留 2 位 |
| cumulative_pct | 累计入账占总入账的百分比,四舍五入保留 2 位 |
排序规则
- actual_revenue 降序。
- site_id 升序。
数据样例
| site_idPKBIGINT | site_nameVARCHAR(64) | site_typeVARCHAR(16) | capacityTINYINT | daily_priceDECIMAL(7, 2) | regionVARCHAR(32) |
|---|---|---|---|---|---|
| 1 | 湖畔一号 | tent | 4 | 680 | 湖畔区 |
| 2 | 云杉木屋 | cabin | 6 | 1280 | 森林区 |
| 3 | 星空房车 | rv | 5 | 980 | 观星区 |
| 4 | 溪谷天幕 | canopy | 8 | 520 | 溪谷区 |
| 5 | 山脊木屋 | cabin | 4 | 1180 | 山脊区 |
| 6 | 竹林帐篷 | tent | 3 | 480 | 竹林区 |
| 7 | 日落房车 | rv | 4 | 880 | 观景区 |
| 8 | 松林天幕 | canopy | 6 | 560 | 森林区 |
输入数据显示 8 / 8 行
SQL 编辑器正在保存草稿...
Ctrl + Enter 运行
正在加载 SQL 编辑器...
运行你的 SQL 查询后,结果将显示在这里