如何在Apache IoTDB中查询全系统范围内的单一最新数据值
Apache IoTDB 2.0.5 查询全系统单一最新值的解决方案
使用树形数据模型的Apache IoTDB 2.0.5,想要查询全系统(包含多个传感器/时间序列)的单一最新值,尝试过LAST和LAST_VALUE函数,但均未得到预期结果。
示例数据
IoTDB> SELECT * FROM `root.factory`.** ALIGN BY DEVICE +-----------------------------+---------------+-----------+ | `Time`| Device|temperature| +-----------------------------+---------------+-----------+ |1970-01-01T08:00:01.000+08:00|`root.factory.d1`| 25.0| |1970-01-01T08:00:02.000+08:00|`root.factory.d1`| 26.0| |1970-01-01T08:00:01.500+08:00|`root.factory.d2`| 30.0| |1970-01-01T08:00:02.500+08:00|`root.factory.d2`| 31.0| +-----------------------------+---------------+-----------+
已尝试的查询
查询1——使用LAST_VALUE函数
IoTDB> SELECT `LAST_VALUE`(temperature) FROM `root.factory`.* +---------------------------------------+---------------------------------------+ |`last_value`(`root.factory.d1.temperature`)|`last_value`(`root.factory.d2.temperature`)| +---------------------------------------+---------------------------------------+ | 26.0| 31.0| +---------------------------------------+---------------------------------------+
查询2——使用LAST
IoTDB> SELECT LAST temperature FROM `root.factory`.* +-----------------------------+---------------------------+-----+--------+ | `Time`| Timeseries|Value|DataType| +-----------------------------+---------------------------+-----+--------+ |1970-01-01T08:00:02.500+08:00|`root.factory.d2.temperature`| 31.0| FLOAT| |1970-01-01T08:00:02.000+08:00|`root.factory.d1.temperature`| 26.0| FLOAT| +-----------------------------+---------------------------+-----+--------+
查询3——使用LAST并搭配LIMIT 1
IoTDB> SELECT LAST temperature FROM `root.factory`.* LIMIT 1 +-----------------------------+---------------------------+-----+--------+ | `Time`| Timeseries|Value|DataType| +-----------------------------+---------------------------+-----+--------+ |1970-01-01T08:00:02.500+08:00|`root.factory.d2.temperature`| 31.0| FLOAT| +-----------------------------+---------------------------+-----+--------+
期望结果
需要获取全系统所有设备中基于时间戳的单一最新值,仅返回时间戳和对应值,格式如下:
+-----------------------------+-----------------------------------+ | `Time`| `root.factory`.*.temperature| +-----------------------------+-----------------------------------+ |1970-01-01T08:00:02.500+08:00| 31.0| +-----------------------------+-----------------------------------+
解决方案
使用嵌套查询结合排序与列重命名来实现,SQL语句如下:
SELECT `Time`, Value AS `root.factory`.*.temperature FROM (SELECT LAST temperature FROM `root.factory`.*) ORDER BY `Time` DESC LIMIT 1
语句说明
- 内部子查询
SELECT LAST temperature FROMroot.factory.*:获取所有设备温度指标的最新记录,包含时间戳、序列名、值和数据类型。 - 外部查询通过
ORDER BYTimeDESC对所有最新记录按时间戳降序排序,确保时间最晚的记录排在首位。 LIMIT 1仅保留排序后的第一条记录,即全系统时间最新的那个值。- 通过
ASroot.factory.*.temperature将Value列重命名为期望的列名,匹配目标输出格式。
内容的提问来源于stack exchange,提问作者ごまめとにまめ
相关产品推荐
相关产品推荐

