Apache IoTDB 0.13.3如何同时实现分组级查询与空值填充?
在Apache IoTDB 0.13.3中实现按时间层级分组并填充空数据点
要实现按时间粒度(group level)分组查询同时填充空数据点,核心是结合GROUP BY TIME语法指定分组粒度,再通过FILL子句配置空值填充规则。以下是具体用法和示例:
核心语法结构
SELECT <聚合函数>(<测点>) FROM <存储组路径> WHERE time <时间范围> GROUP BY TIME(<时间粒度>) FILL(<填充规则>);
常用填充规则及示例
1. 前向填充(沿用前一个非空值)
适合连续型数据(如温度、湿度),当某时间段无数据时,使用上一个有数据的时间段的值填充:
SELECT AVG(temperature) FROM root.sensor.device0 WHERE time >= '2024-05-01 00:00:00' AND time <= '2024-05-01 23:59:59' GROUP BY TIME(1h) FILL(previous);
2. 固定值填充
直接用指定常量填充空数据点,适合状态类数据或需要统一默认值的场景:
SELECT MAX(humidity) FROM root.sensor.device0 WHERE time >= '2024-05-01 00:00:00' AND time <= '2024-05-01 23:59:59' GROUP BY TIME(30m) FILL(0);
3. 线性填充
基于前后非空值的线性插值填充,适合数值型连续数据的补全:
SELECT SUM(power_consumption) FROM root.sensor.device0 WHERE time >= '2024-05-01 00:00:00' AND time <= '2024-05-01 02:00:00' GROUP BY TIME(1h) FILL(linear);
4. 多测点不同填充规则
如果查询多个测点,可为每个测点单独指定填充方式:
SELECT AVG(temperature), MAX(humidity) FROM root.sensor.device0 WHERE time >= '2024-05-01 00:00:00' AND time <= '2024-05-01 23:59:59' GROUP BY TIME(1h) FILL(temperature WITH previous, humidity WITH 0);
注意事项
GROUP BY TIME后的时间粒度支持多种单位,如1s(秒)、5m(分钟)、2h(小时)、1d(天)等FILL子句仅对GROUP BY TIME生成的空数据点生效,会确保时间范围内的每个分组时段都有数据行返回- IoTDB 0.13.3暂不支持跨设备分组的填充,仅针对单设备或同存储组下的设备生效
内容的提问来源于stack exchange,提问作者张满月
相关产品推荐
相关产品推荐

