首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SQL 骑手接单量排名:COUNT + RANK窗口函数(美团面试题)

SQL 骑手接单量排名:COUNT + RANK窗口函数(美团面试题)

作者头像
数据仓库晨曦
发布2026-07-29 21:05:55
发布2026-07-29 21:05:55
20
举报
文章被收录于专栏:数据仓库技术数据仓库技术

一、题目背景

这道题来自美团外卖配送部门的数据分析岗面试。美团有数百万注册骑手,骑手的接单量直接影响配送运力的利用率。统计每个骑手的日接单量和排名,是骑手绩效考核和调度优化的基础数据。

业务场景:骑手管理的核心指标是"日接单量"——太少说明该骑手利用率低,太多可能导致超时。区域调度员每天看骑手接单排名,对排名垫底的骑手做培训提醒,对排名靠前的骑手发放奖励。

二、题目

现有一张外卖订单表 t4_order_info,记录了每笔订单的骑手信息和接单时间。请统计每个骑手的日接单量及日排名。

外卖订单表 t4_order_info:

代码语言:javascript
复制
+-----------+-----------+----------------------+
| order_id  | rider_id  |      order_time      |
+-----------+-----------+----------------------+
| O001      | R01       | 2023-03-01 10:00:00  |
| O002      | R02       | 2023-03-01 10:30:00  |
| O003      | R01       | 2023-03-01 11:00:00  |
| O004      | R03       | 2023-03-01 11:30:00  |
| O005      | R01       | 2023-03-01 12:00:00  |
| O006      | R02       | 2023-03-01 12:30:00  |
| O007      | R01       | 2023-03-02 10:00:00  |
| O008      | R02       | 2023-03-02 10:30:00  |
| O009      | R02       | 2023-03-02 11:00:00  |
| O010      | R03       | 2023-03-02 11:30:00  |
| O011      | R03       | 2023-03-02 12:00:00  |
| O012      | R01       | 2023-03-02 12:30:00  |
+-----------+-----------+----------------------+

三、思路分析

本题考察分组聚合 + 窗口排名,是骑手绩效分析的基础题。

解题步骤

  1. 提取日期 substr(order_time, 1, 10)
  2. 按骑手+日期分组统计接单量;
  3. 使用 RANK() 按日期分组、按接单量降序排名;

维度

评分

题目难度

⭐️⭐️

题目清晰度

⭐️⭐️⭐️⭐️⭐️

业务常见度

⭐️⭐️⭐️⭐️⭐️

四、逐步推导

1. 按骑手+日期统计接单量

执行SQL

代码语言:javascript
复制
select rider_id,
       substr(order_time, 1, 10) as order_date,
       count(1)                   as order_cnt
from t4_order_info
group by rider_id, substr(order_time, 1, 10)
order by order_date, order_cnt desc

执行结果

代码语言:javascript
复制
+-----------+-------------+------------+
| rider_id  | order_date  | order_cnt  |
+-----------+-------------+------------+
| R01       | 2023-03-01  | 3          |
| R02       | 2023-03-01  | 2          |
| R03       | 2023-03-01  | 1          |
| R03       | 2023-03-02  | 2          |
| R02       | 2023-03-02  | 2          |
| R01       | 2023-03-02  | 2          |
+-----------+-------------+------------+
6 rows selected (1.08 seconds)(https://www.dwsql.com)

2. 按日对骑手接单量排名

执行SQL

代码语言:javascript
复制
select rider_id,
       order_date,
       order_cnt,
       rank() over (partition by order_date order by order_cnt desc) as daily_rank
from (
    select rider_id,
           substr(order_time, 1, 10) as order_date,
           count(1)                   as order_cnt
    from t4_order_info
    group by rider_id, substr(order_time, 1, 10)
) t
order by order_date, daily_rank

执行结果

代码语言:javascript
复制
+-----------+-------------+------------+-------------+
| rider_id  | order_date  | order_cnt  | daily_rank  |
+-----------+-------------+------------+-------------+
| R01       | 2023-03-01  | 3          | 1           |
| R02       | 2023-03-01  | 2          | 2           |
| R03       | 2023-03-01  | 1          | 3           |
| R03       | 2023-03-02  | 2          | 1           |
| R02       | 2023-03-02  | 2          | 1           |
| R01       | 2023-03-02  | 2          | 1           |
+-----------+-------------+------------+-------------+
6 rows selected (0.661 seconds)(https://www.dwsql.com)

3月1日R01以3单排名第一;3月2日三人均为2单并列第一。

五、常见坑点

坑1:日期提取方式影响性能

substr(order_time, 1, 10) 字符串截取和 date_format(order_time, 'yyyy-MM-dd') 效果相同,但 date_format 需要对字符串做日期解析,略慢。如果 order_time 已经是标准格式,用 substr 更高效。

坑2:RANK 并列时的排名展示

三人接单量都是2单时,RANK 返回 (1,1,1),DENSE_RANK 也返回 (1,1,1),ROW_NUMBER 则是 (1,2,3)。以"日排名"展示给骑手时,用 RANK 或 DENSE_RANK 更公平——同样接单量不应该被硬分出名次。

六、举一反三

  1. 按周/月汇总:GROUP BY rider_id + week/month,统计骑手周/月总接单量和平均日接单量
  2. 接单量+准时率综合排名:加权公式 = 接单量 × 0.5 + 准时率 × 0.5,综合评估骑手绩效
  3. 时段细分:按午高峰/晚高峰/非高峰时段分别统计,识别不同骑手的时段偏好和能力
  4. 新骑手爬坡分析:统计骑手注册后前30天的日接单量趋势,评估新骑手培训效果

七、知识点总结

考点

说明

substr 提取日期

从完整时间戳截取日期部分用于按日分组

GROUP BY rider_id + date

按骑手和日期双维度聚合统计接单量

RANK() OVER(PARTITION BY date)

按日分组、按接单量降序排名

并列排名的选择

RANK/DENSE_RANK/ROW_NUMBER 三种语义差异

八、建表语句和数据插入

代码语言:javascript
复制
CREATE TABLE t4_order_info (
    order_id   string COMMENT '订单ID',
    rider_id   string COMMENT '骑手ID',
    order_time string COMMENT '接单时间'
) COMMENT '外卖订单表';

-- 数据插入
INSERT INTO t4_order_info VALUES
('O001', 'R01', '2023-03-01 10:00:00'),
('O002', 'R02', '2023-03-01 10:30:00'),
('O003', 'R01', '2023-03-01 11:00:00'),
('O004', 'R03', '2023-03-01 11:30:00'),
('O005', 'R01', '2023-03-01 12:00:00'),
('O006', 'R02', '2023-03-01 12:30:00'),
('O007', 'R01', '2023-03-02 10:00:00'),
('O008', 'R02', '2023-03-02 10:30:00'),
('O009', 'R02', '2023-03-02 11:00:00'),
('O010', 'R03', '2023-03-02 11:30:00'),
('O011', 'R03', '2023-03-02 12:00:00'),
('O012', 'R01', '2023-03-02 12:30:00');
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据仓库技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、题目背景
  • 二、题目
  • 三、思路分析
  • 四、逐步推导
    • 1. 按骑手+日期统计接单量
    • 2. 按日对骑手接单量排名
  • 五、常见坑点
  • 六、举一反三
  • 七、知识点总结
  • 八、建表语句和数据插入
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档