SQL实现按24小时间隔分段统计近120小时分组记录数
实现方法
核心逻辑是先计算每条记录的更新时间距当前时间的小时差,匹配对应的24小时时段标签,过滤120小时前的历史数据后,同时按业务字段、时段标签做分组聚合,即可返回要求的三列统计结果。
可直接运行的SQL代码如下(适配MySQL语法,和你原有SQL的函数体系兼容):
SELECT COUNT(*) AS `count`, table_column AS `column`, CASE WHEN TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) >= 0 AND TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) < 24 THEN '0-24' WHEN TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) >= 24 AND TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) < 48 THEN '24-48' WHEN TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) >= 48 AND TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) < 72 THEN '48-72' WHEN TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) >= 72 AND TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) < 96 THEN '72-96' WHEN TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) >= 96 AND TIMESTAMPDIFF(HOUR, UPDATED_TIME, NOW()) < 120 THEN '96-120' END AS `time` FROM table_name WHERE UPDATED_TIME >= DATE_SUB(NOW(), INTERVAL 120 HOUR) GROUP BY table_column, `time` ORDER BY `column`, CASE `time` WHEN '0-24' THEN 1 WHEN '24-48' THEN 2 WHEN '48-72' THEN 3 WHEN '72-96' THEN 4 WHEN '96-120' THEN 5 END;
注意事项
- 原SQL使用
CURDATE()取当日零点作为时间计算基准,会导致统计区间和真实的「距当前N小时」存在偏差,这里改用NOW()取当前实时时间计算,保证每个时段都是严格的24小时间隔 - 原SQL写
SELECT *配合GROUP BY的写法不规范,会触发MySQLONLY_FULL_GROUP_BY模式报错,返回结果也不符合聚合统计的要求,必须明确指定需要返回的统计字段、分组字段 - 如果后续需要扩展统计更长的时间范围,直接在CASE语句里追加对应的时段判断分支即可
内容的提问来源于stack exchange,提问作者Durgesh gupta
相关产品推荐
相关产品推荐

