SQL查询:按小时拆分日期统计指定区间最高订单量
单小时最高订单量SQL实现方案
你之前使用MAX()、COUNT()、DATETIME()组合未得到预期结果,核心原因有两点:一是SQL语法不支持同一查询层级直接嵌套聚合函数(即直接写MAX(COUNT(*))不符合执行逻辑);二是没有先将订单时间对齐截断到小时粒度做分组,无法独立统计每个小时段的订单数。
实现步骤
- 小时粒度对齐:将每条订单的时间字段截断到所属小时的起始点,抹除分、秒、毫秒差异,作为每个小时段的唯一标识,不同数据库的截断写法如下:
- MySQL:
DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') - PostgreSQL:
DATE_TRUNC('hour', order_time) - SQL Server:
DATEADD(hour, DATEDIFF(hour, 0, order_time), 0)
- MySQL:
- 范围筛选+分组统计:先过滤出2022年7月8日至2022年7月15日的所有有效订单,再按截断后的小时字段分组,统计每个独立小时段的订单总数。
- 极值提取:对分组统计得到的各小时订单量结果,提取最大值即可。
参考代码(以MySQL为例)
-- 仅返回最高单小时订单量数值 SELECT MAX(hour_order_cnt) AS max_single_hour_order FROM ( SELECT COUNT(*) AS hour_order_cnt FROM orders WHERE order_time >= '2022-07-08 00:00:00' AND order_time < '2022-07-16 00:00:00' GROUP BY DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') ) AS hour_stat; -- 返回最高订单量对应的具体小时段+数值 SELECT DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') AS stat_hour, COUNT(*) AS hour_order_cnt FROM orders WHERE order_time >= '2022-07-08 00:00:00' AND order_time < '2022-07-16 00:00:00' GROUP BY DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') ORDER BY hour_order_cnt DESC LIMIT 1;
注意:时间范围筛选不建议使用
BETWEEN,采用>= 起始时间、< 统计截止日次日0点的写法,可以避免因为时间字段携带毫秒/微秒精度,遗漏统计周期最后时段的订单。
内容的提问来源于stack exchange,提问作者Robert Facio
相关产品推荐
相关产品推荐

