【携程】统计门店每日补位班次 2 小时内确认率 Top1
聚合函数窗口函数CASE WHEN排行榜面试真题
题目描述
来源:携程 SQL 面试真题
某即时零售平台在晚高峰前,会给门店的骑手补位班次发送“待确认邀约”。同一个班次可能会在不同时间多次推送给不同骑手,也可能被同一骑手多次看到。运营团队希望统计指定日期范围内、每个门店每天最终成功开班的补位班次在发出邀约后的 2 小时内确认情况,并找出门店当日表现最好的补位班次。
数据表
relief_shifts 补位班次主表
| 字段 | 类型 | 说明 |
|---|---|---|
| shift_id | BIGINT | 补位班次 ID,主键 |
| store_id | BIGINT | 门店 ID |
| shift_date | DATE | 班次日期 |
| shift_period | VARCHAR(20) | 班次时段,例如 lunch、afternoon、dinner、night |
| required_rider_count | INT | 该班次需要补位的骑手数量 |
| published_at | DATETIME | 班次首次发出邀约的时间 |
| shift_status | VARCHAR(20) | 班次最终状态,例如 filled、cancelled |
shift_invite_responses 班次邀约反馈表
| 字段 | 类型 | 说明 |
|---|---|---|
| response_id | BIGINT | 反馈记录 ID,主键 |
| shift_id | BIGINT | 所属补位班次 ID |
| rider_id | BIGINT | 骑手 ID |
| invited_at | DATETIME | 该次邀约发出时间 |
| responded_at | DATETIME | 骑手反馈时间,NULL 表示未反馈 |
| response_status | VARCHAR(20) | 反馈结果,例如 accepted、declined、ignored |
业务规则
- 只统计 shift_date 在 2025-08-15 到 2025-08-17 之间且 shift_status = 'filled' 的补位班次。
- 对同一个 shift_id + rider_id,只保留 invited_at 最早的那条记录作为该骑手的首轮邀约记录;如果时间相同,使用 response_id 更小的记录保证结果稳定。
- 2 小时内确认成功必须同时满足:response_status = 'accepted'、responded_at 不为 NULL、responded_at 不晚于 invited_at 后 2 小时。
- accepted_in_2h_rider_count 是班次内满足条件的不同骑手数。
- acceptance_rate = accepted_in_2h_rider_count / required_rider_count,四舍五入保留 2 位小数。
- 每个 store_id + shift_date 只保留 acceptance_rate 最高的一个班次。
- 如果确认率相同,依次比较 accepted_in_2h_rider_count 更大、published_at 更早、shift_id 更小。
输出字段
| 字段 | 说明 |
|---|---|
| store_id | 门店 ID |
| shift_date | 班次日期 |
| shift_id | 补位班次 ID |
| shift_period | 班次时段 |
| required_rider_count | 需要补位人数 |
| accepted_in_2h_rider_count | 2 小时内确认成功的骑手数 |
| acceptance_rate | 2 小时内确认率,四舍五入保留 2 位小数 |
结果按 shift_date 升序、store_id 升序、shift_id 升序排列。
数据样例
| shift_idPKBIGINT | store_idBIGINT | shift_dateDATE | shift_periodVARCHAR(20) | required_rider_countINT | published_atDATETIME | shift_statusVARCHAR(20) |
|---|---|---|---|---|---|---|
| 1001 | 101 | 2025-08-15 | lunch | 3 | 2025-08-15 08:00:00 | filled |
| 1002 | 101 | 2025-08-15 | dinner | 2 | 2025-08-15 09:00:00 | filled |
| 1003 | 101 | 2025-08-16 | lunch | 2 | 2025-08-16 08:00:00 | filled |
| 1004 | 101 | 2025-08-16 | afternoon | 3 | 2025-08-16 07:00:00 | filled |
| 1005 | 101 | 2025-08-17 | night | 2 | 2025-08-17 08:00:00 | cancelled |
| 2001 | 202 | 2025-08-15 | lunch | 2 | 2025-08-15 08:00:00 | filled |
| 2002 | 202 | 2025-08-15 | dinner | 4 | 2025-08-15 07:30:00 | filled |
| 2003 | 202 | 2025-08-17 | night | 2 | 2025-08-17 09:00:00 | cancelled |
输入数据显示 8 / 10 行
SQL 编辑器正在保存草稿...
Ctrl + Enter 运行
正在加载 SQL 编辑器...
运行你的 SQL 查询后,结果将显示在这里