如何在Apache IoTDB中查询传感器连续N次超阈值的事件次数
问题:统计Apache IoTDB 2.0.5中连续3个数据点超80度的事件次数
我在Apache IoTDB 2.0.5中有一个设备温度监测时间序列:root.factory.machine.sensor.temperature,需要找出所有温度连续3个数据点超过80度的事件,并统计这类事件的发生次数。
数据示例
+-----------------------------+---------------------------------------+ | Time | root.factory.machine.sensor.temperature | +-----------------------------+---------------------------------------+ |2025-11-01T08:00:00.000+08:00| 75.0| |2025-11-01T08:00:01.000+08:00| 82.0| |2025-11-01T08:00:02.000+08:00| 85.0| |2025-11-01T08:00:03.000+08:00| 81.0| |2025-11-01T08:00:04.000+08:00| 79.0| |2025-11-01T08:00:05.000+08:00| 83.0| |2025-11-01T08:00:06.000+08:00| 84.0| |2025-11-01T08:00:07.000+08:00| 86.0| +-----------------------------+---------------------------------------+
错误尝试及结果
执行以下SQL仅统计了所有超80度的数据点数量,无法识别连续事件:
SELECT COUNT(temperature) as resultnumber FROM root.factory.machine.sensor WHERE temperature > 80
返回结果:
+------------+ |resultnumber| +------------+ | 6| +------------+
预期结果
需要统计连续事件的次数,预期结果为:
+------------+ |resultnumber| +------------+ | 2| +------------+
数据中存在两段符合要求的连续事件:
- 第一段:2025-11-01T08:00:01/82.0、2025-11-01T08:00:02/85.0、2025-11-01T08:00:03/81.0
- 第二段:2025-11-01T08:00:05/83.0、2025-11-01T08:00:06/84.0、2025-11-01T08:00:07/86.0
解决方案
可以通过分组标记连续超温段的方式实现需求,具体SQL如下:
SELECT COUNT(*) AS resultnumber FROM ( SELECT group_id FROM ( SELECT Time, temperature, -- 标记当前数据点是否超80度 CASE WHEN temperature > 80 THEN 1 ELSE 0 END AS is_over, -- 生成连续超温段的分组ID:每遇到一个不超温的点,分组ID加1 SUM(CASE WHEN temperature <= 80 THEN 1 ELSE 0 END) OVER (ORDER BY Time) AS group_id FROM root.factory.machine.sensor ) AS marked_data -- 只保留超温的数据点 WHERE is_over = 1 -- 按分组ID统计每个连续超温段的数据点数量 GROUP BY group_id -- 筛选出数据点数量>=3的连续段 HAVING COUNT(*) >= 3 ) AS valid_groups;
逻辑说明
- 标记超温状态:用
CASE WHEN给每个数据点标记is_over,1表示超80度,0表示未超。 - 生成连续分组ID:通过窗口函数
SUM() OVER (ORDER BY Time),每次遇到未超温的点就累加1,这样连续的超温点会被分配到同一个group_id中。 - 筛选有效连续段:按
group_id分组后,统计每个组的数据点数量,只保留数量≥3的组。 - 统计事件次数:最后统计这些有效组的数量,就是符合要求的连续超温事件次数。
执行该SQL后会得到预期的resultnumber=2的结果。
内容的提问来源于stack exchange,提问作者MGS
相关产品推荐
相关产品推荐

