You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;

逻辑说明

  1. 标记超温状态:用CASE WHEN给每个数据点标记is_over,1表示超80度,0表示未超。
  2. 生成连续分组ID:通过窗口函数SUM() OVER (ORDER BY Time),每次遇到未超温的点就累加1,这样连续的超温点会被分配到同一个group_id中。
  3. 筛选有效连续段:按group_id分组后,统计每个组的数据点数量,只保留数量≥3的组。
  4. 统计事件次数:最后统计这些有效组的数量,就是符合要求的连续超温事件次数。

执行该SQL后会得到预期的resultnumber=2的结果。


内容的提问来源于stack exchange,提问作者MGS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 20:12:38