Hackerrank SQL题求解:如何分组查询同一配送员不同日期的配送明细
查询逻辑核心思路
先理清题目要求的输出粒度,再对应选择是否需要分组:
- 如果需求是逐行展示每一笔配送任务的明细(每一条delivery记录单独一行),不需要写
GROUP BY,只需要关联两张表后按维度排序,就能实现同一配送员的记录按日期聚拢展示的效果。 - 如果需求是按维度做聚合统计(比如统计配送员在某一天的总单量、总配送时长),才需要用到
GROUP BY。分组字段的选择完全匹配输出维度:要区分不同配送员,就把配送员的唯一标识字段加入分组;要区分不同日期,就把配送日期字段加入分组。
场景1:纯配送明细展示代码
不需要聚合的场景,直接关联查询后排序:
SELECT de.Name AS 配送员姓名, d.delivery_date AS 配送日期, d.deliveryId AS 配送单编号, d.Pickup_time AS 取件时间, d.delivery_time AS 送达时间, TIMESTAMPDIFF(MINUTE, d.Pickup_time, d.delivery_time) AS 单票配送时长_分钟 FROM delivery d INNER JOIN delivery_executive de ON d.De_Id = de.ID -- 排序逻辑:先按配送员ID聚拢,再按配送日期排,最后按取件时间从早到晚排 ORDER BY de.ID, d.delivery_date, d.Pickup_time;
这个查询的输出效果会把同一个配送员的所有配送记录归到相邻位置,每个配送员的记录下再按日期拆分,不需要任何分组操作。
场景2:按配送员+日期聚合统计代码
如果题目要求输出每个配送员在每个日期的汇总数据,分组逻辑非常明确,必须同时按两个维度分组:
SELECT de.Name AS 配送员姓名, d.delivery_date AS 配送日期, COUNT(d.deliveryId) AS 当日总配送单量, SUM(TIMESTAMPDIFF(MINUTE, d.Pickup_time, d.delivery_time)) AS 当日总配送时长_分钟, AVG(TIMESTAMPDIFF(MINUTE, d.Pickup_time, d.delivery_time)) AS 当日平均单票时长_分钟 FROM delivery d INNER JOIN delivery_executive de ON d.De_Id = de.ID -- 核心分组:覆盖输出维度的两个字段,避免数据混同 GROUP BY de.ID, de.Name, d.delivery_date ORDER BY de.ID, d.delivery_date;
常见分组误区提醒
- 分组时缺字段会导致统计值错误:比如只按配送员分组,会把该配送员跨所有日期的数据合并成一行,完全无法区分日期差异;只按日期分组,会把当天所有配送员的数据合并成一行,无法区分人员差异。
- 严格SQL模式下,
SELECT列表里的非聚合字段必须全部出现在GROUP BY子句中,否则会直接报语法错误。 - 纯明细展示不需要硬套分组逻辑,靠
ORDER BY就能实现同类数据聚拢展示的效果。
内容的提问来源于stack exchange,提问作者TheOrgasmicThinker
相关产品推荐
相关产品推荐

