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

如何使用Apache IoTDB查询时间序列最后一次数据变更的时间与值?

Apache IoTDB 查询各序列最后一次数据变更的时间与值

针对root.device_id下的多时间序列,要获取每个序列最后一次值变更的时间及对应值,这里提供两种适配不同场景的查询语句:

场景1:仅返回存在值变更的序列结果

如果只需要找出确实发生过值变更的序列,取最后一次变更的时间和变更后的值,可以使用LAG窗口函数对比相邻值:

SELECT s, time AS change_time, value AS new_value
FROM (
    SELECT 
        s,
        time,
        value,
        LAG(value, 1) OVER (PARTITION BY s ORDER BY time) AS prev_value
    FROM root.device_id.*
)
WHERE value != prev_value
QUALIFY ROW_NUMBER() OVER (PARTITION BY s ORDER BY time DESC) = 1

语句说明:

  1. 内层查询通过LAG函数获取每个序列上一个时间点的数值,按序列分组、时间排序。
  2. 外层过滤出当前值与上一个值不同的记录(即发生变更的节点)。
  3. 最后通过QUALIFY和ROW_NUMBER筛选出每个序列中时间最晚的变更记录,即为最后一次变更的信息。

场景2:所有序列都返回结果(含无变更的序列)

如果需要覆盖所有序列——包括从未发生值变更的序列(此时返回序列的唯一值和最早写入时间),可以通过先获取最后值再找其首次出现时间的方式:

SELECT s, first_time AS change_time, last_value AS current_value
FROM (
    SELECT 
        s,
        LAST_VALUE(value) OVER (PARTITION BY s) AS last_value,
        time AS first_time
    FROM root.device_id.*
    WHERE value = LAST_VALUE(value) OVER (PARTITION BY s)
)
QUALIFY ROW_NUMBER() OVER (PARTITION BY s ORDER BY first_time ASC) = 1

语句说明:

  1. 内层查询先获取每个序列的最终值last_value,然后筛选出所有等于该值的记录。
  2. 外层通过ROW_NUMBER取这些记录中时间最早的一条,该时间就是最终值首次出现的时间(即最后一次变更的时间;若序列从未变更,就是初始值的写入时间)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 08:13:28