MySQL求助:按时间区间分组统计各传感器告警数量
MySQL传感器告警分时间区间统计实现
核心实现逻辑:先提取全量唯一传感器ID作为基础数据集,再通过左连接+条件聚合完成三个时间窗的计数,保证所有传感器都会出现在结果中,即使对应区间告警数为0也不会丢行。
注意:以下示例默认以统计执行时的当前时间
NOW()作为时间差计算的锚点,如果你需要以固定时间(例如2022年7月1日零点)为统计基准,把代码中所有NOW()替换为对应时间字符串即可,例如'2022-07-01 00:00:00'。
SELECT s.SensorID AS Sensor, SUM(CASE WHEN TIMESTAMPDIFF(HOUR, a.Alert_timestamp, NOW()) < 24 THEN 1 ELSE 0 END) AS `<24hrs`, SUM(CASE WHEN TIMESTAMPDIFF(HOUR, a.Alert_timestamp, NOW()) >= 24 AND TIMESTAMPDIFF(HOUR, a.Alert_timestamp, NOW()) < 168 THEN 1 ELSE 0 END) AS `24 to 168hrs`, SUM(CASE WHEN TIMESTAMPDIFF(HOUR, a.Alert_timestamp, NOW()) >= 168 AND TIMESTAMPDIFF(HOUR, a.Alert_timestamp, NOW()) < 336 THEN 1 ELSE 0 END) AS `168 to 336hrs` FROM (SELECT DISTINCT SensorID FROM 你的告警日志表名) s LEFT JOIN 你的告警日志表名 a ON s.SensorID = a.SensorID -- 可选项:过滤336小时之前的无效记录,减少查询计算量 AND TIMESTAMPDIFF(HOUR, a.Alert_timestamp, NOW()) < 336 GROUP BY s.SensorID;
注意事项
- 代码中
你的告警日志表名需要替换为你实际使用的告警日志表真实表名 - 时间差计算使用
TIMESTAMPDIFF(HOUR, 更早的时间, 更晚的时间)写法,避免直接做时间戳减法产生时区、精度换算误差 - 优先用
SUM搭配CASE做条件计数,比COUNT套条件的写法逻辑更直观,新手排查问题时更容易定位错误,不会因为左连接生成的NULL值出现计数不准的问题 - GoDaddy部署的MySQL实例默认对表名、字段名大小写不敏感,如果你建表时用了特殊命名,按照实际字段名调整即可
内容的提问来源于stack exchange,提问作者TheOneTruePatrick
相关产品推荐
相关产品推荐

