MySQL 需要查询帮助 - 计算时间戳分组范围

MySQL query help needed - Counting timestamps grouped ranges

你以为这很简单,但被踢了一个晚上。我有一个传感器警报日志,并希望为每个不同的传感器生成一个 table,其中包含 24 小时、168 小时(1 周)和 336 小时(2 周)内的事件的简单计数。我在 MySQL(GoDaddy 上的 运行)相对较新并且是自学成才的,并且尝试了我在网上找到的计数、唯一、大小写等的所有变体。帮我欧比旺...

示例数据:

Alert_timestamp SensorID
2022-05-18 21:41:59 Sensor 1
2022-05-21 21:52:09 Sensor 1
2022-05-24 05:00:39 Sensor 2
2022-05-24 05:02:26 Sensor 1
2022-05-24 18:37:34 Sensor 4
2022-05-24 20:48:40 Sensor 1
2022-05-26 21:20:54 Sensor 2
2022-05-27 14:53:02 Sensor 1
2022-06-01 19:06:14 Sensor 4
2022-06-02 19:22:27 Sensor 1
... ...

期望输出(注意:下面的计数与上面的 table 不对应)。即使传感器的警报为零(例如传感器存在于 table,但日期范围内没有事件),我也想看到这些。

       count of events that fall within these ranges
Sensor <24hrs 24 to 168hrs 168 to 336hrs
Sensor 1 1 1 0
Sensor 2 0 2 5
Sensor 3 0 0 0
Sensor 4 6 2 3

提前致谢!

使用条件聚合。

SELECT SensorID, 
       SUM(    Alert_timestamp >  CURRENT_TIMESTAMP - INTERVAL  24 HOUR)  `<24hrs`,
       SUM(    Alert_timestamp <= CURRENT_TIMESTAMP - INTERVAL  24 HOUR
           AND Alert_timestamp >  CURRENT_TIMESTAMP - INTERVAL 168 HOUR)  `24 to 168hrs`,
       SUM(    Alert_timestamp <= CURRENT_TIMESTAMP - INTERVAL 168 HOUR
           AND Alert_timestamp >  CURRENT_TIMESTAMP - INTERVAL 336 HOUR)  `168 to 336hrs`       
FROM table 
WHERE Alert_timestamp > CURRENT_TIMESTAMP - INTERVAL 336 HOUR
GROUP BY SensorID

如果 table 包含“将来”的行,则将根据条件添加到第一个聚合和 WHERE。

(SensorID, Alert_timestamp)的索引会有所改善。