如何编写SQL按秒/分/小时等时间单位聚合统计到店客户数
完全可以通过时间截断+分组计数的逻辑实现不同时间单位的客户到店数统计,核心思路是将每条记录的arrival_time字段对齐到目标统计粒度,再按对齐后的时间值分组计数即可。
注意:如果你的arrival_time字段是字符串格式存储(即你示例中给出的12/1/2020 12:01:39 AM这类文本值),需要先通过数据库的时间转换函数将其转为标准时间类型再做处理。以下以最常用的MySQL语法为例给出不同粒度的实现代码,其他数据库可对应替换为自身支持的时间截断/格式化函数。
各时间粒度统计示例
- 按秒粒度统计
统计每一秒内的到店客户总数:
SELECT
DATE_FORMAT(arrival_time, '%Y-%m-%d %H:%i:%s') AS stat_time,
COUNT(*) AS customer_total
FROM customers
GROUP BY stat_time
ORDER BY stat_time;
- 按分钟粒度统计 将秒级时间对齐到整分钟,统计每分钟到店客户总数: ```sql SELECT DATE_FORMAT(arrival_time, '%Y-%m-%d %H:%i:00') AS stat_time, COUNT(*) AS customer_total FROM customers GROUP BY stat_time ORDER BY stat_time;
- 按小时粒度统计
将分秒级时间对齐到整小时,统计每小时到店客户总数:
SELECT
DATE_FORMAT(arrival_time, '%Y-%m-%d %H:00:00') AS stat_time,
COUNT(*) AS customer_total
FROM customers
GROUP BY stat_time
ORDER BY stat_time;
- 按天粒度统计 截断时分秒部分,统计每日到店客户总数: ```sql SELECT DATE(arrival_time) AS stat_date, COUNT(*) AS customer_total FROM customers GROUP BY stat_date ORDER BY stat_date;
其他数据库适配提示:
- PostgreSQL:直接使用内置的
date_trunc函数即可,按分钟统计的写法为date_trunc('minute', arrival_time) AS stat_time,粒度参数可替换为second/hour/day等- SQL Server:通过日期偏移计算实现截断,按分钟统计的写法为
DATEADD(minute, DATEDIFF(minute, 0, arrival_time), 0) AS stat_time- Oracle:使用
TRUNC函数做时间截断,按小时统计的写法为TRUNC(arrival_time, 'HH24') AS stat_time
如果你的arrival_time是字符串格式存储,在MySQL中可以用STR_TO_DATE(arrival_time, '%c/%e/%Y %h:%i:%s %p')替换上述SQL中所有的arrival_time字段,先做格式转换再统计即可。
内容的提问来源于stack exchange,提问作者Mazen Ezzeddine

