如何使用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
语句说明:
- 内层查询通过
LAG函数获取每个序列上一个时间点的数值,按序列分组、时间排序。 - 外层过滤出当前值与上一个值不同的记录(即发生变更的节点)。
- 最后通过
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
语句说明:
- 内层查询先获取每个序列的最终值
last_value,然后筛选出所有等于该值的记录。 - 外层通过
ROW_NUMBER取这些记录中时间最早的一条,该时间就是最终值首次出现的时间(即最后一次变更的时间;若序列从未变更,就是初始值的写入时间)。
内容的提问来源于stack exchange,提问作者tvon
相关产品推荐
相关产品推荐

