如何在Apache IoTDB中按指定时间查询测点,无值时取最近值?
在Apache IoTDB中实现指定时间查询及无数据时的取值逻辑
1. 指定时间查询测点,无数据时取最近时间值
如果要获取离指定时间点最近的测点数据(无论时间在指定点之前还是之后),可以分场景处理或用一条SQL实现:
分步查询方式
- 先查指定时间点的精准数据:
SELECT sensor FROM root.sg.d WHERE time = '2023-10-01 12:00:00'
- 若没结果,查指定时间前最近的一条:
SELECT sensor FROM root.sg.d WHERE time <= '2023-10-01 12:00:00' ORDER BY time DESC LIMIT 1
- 要是还是空(说明指定时间前无数据),查指定时间后最早的一条:
SELECT sensor FROM root.sg.d WHERE time >= '2023-10-01 12:00:00' ORDER BY time ASC LIMIT 1
单条SQL实现(取时间差最小的记录)
通过计算每条数据与指定时间的时间差,取差值最小的那条,同时可以缩小时间范围提升效率:
SELECT sensor FROM ( SELECT sensor, ABS(DATEDIFF(ms, time, '2023-10-01 12:00:00')) AS time_diff FROM root.sg.d WHERE time BETWEEN '2023-10-01 11:50:00' AND '2023-10-01 12:10:00' ORDER BY time_diff ASC LIMIT 1 )
2. 使用LAST函数实现无匹配时取最新值
LAST函数的作用是获取指定范围内的最后一条(最新)数据,结合需求可以这么写:
方式一:优先精准匹配,无结果取最新值
用COALESCE函数返回第一个非空结果,精准匹配不到就用LAST取全局最新:
SELECT COALESCE( (SELECT sensor FROM root.sg.d WHERE time = '2023-10-01 12:00:00'), LAST(sensor) ) AS sensor_value FROM root.sg.d LIMIT 1
方式二:限定时间范围取最新
如果只需要指定时间及之前的最新值(有精准匹配则返回该值,否则返回之前的最新),直接用LAST加时间条件:
SELECT LAST(sensor) FROM root.sg.d WHERE time <= '2023-10-01 12:00:00'
内容的提问来源于stack exchange,提问作者zlyf
相关产品推荐
相关产品推荐

