如何使用MySQL统计每小时的订单数量?
按小时统计订单总数的正确SQL写法
你当前使用的窗口函数COUNT() OVER (PARTITION BY order_time)会为每一行数据计算其对应的order_time分组内的订单数,因此会逐行展示重复的统计结果,而非按小时合并汇总。
要实现按小时统计订单总数,需要先将order_time截断到小时级别,再通过GROUP BY分组聚合统计,以下是不同数据库环境下的实现示例:
PostgreSQL/Redshift
SELECT DATE_TRUNC('hour', order_time) AS order_hour, COUNT(order_id) AS num_orders FROM pizza_runner.customer_orders GROUP BY DATE_TRUNC('hour', order_time) ORDER BY order_hour;
MySQL
SELECT DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') AS order_hour, COUNT(order_id) AS num_orders FROM pizza_runner.customer_orders GROUP BY DATE_FORMAT(order_time, '%Y-%m-%d %H:00:00') ORDER BY order_hour;
SQL Server
SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, order_time), 0) AS order_hour, COUNT(order_id) AS num_orders FROM pizza_runner.customer_orders GROUP BY DATEADD(HOUR, DATEDIFF(HOUR, 0, order_time), 0) ORDER BY order_hour;
说明
DATE_TRUNC/DATE_FORMAT/DATEADD+DATEDIFF的作用是将order_time统一转换为对应小时的起始时间(比如2023-01-01 18:15:30会转为2023-01-01 18:00:00),确保同一小时内的订单被归为一组。GROUP BY按处理后的小时时间分组,COUNT(order_id)统计每组内的订单数量,最终得到每个小时的订单总数。- 添加
ORDER BY order_hour可以让结果按时间顺序排列,更易查看。
内容的提问来源于stack exchange,提问作者ASD
相关产品推荐
相关产品推荐

