Apache IoTDB 2.0.5树形模型下GROUP BY跨设备时间窗口平均查询问题
Apache IoTDB 2.0.5全局时间窗口平均值查询问题
背景数据
原始插入数据:
INSERT INTO `root.csgg.d1`(timestamp, temperature) VALUES (1000, 20.0); INSERT INTO `root.csgg.d1`(timestamp, temperature) VALUES (3000, 22.0); INSERT INTO `root.csgg.d2`(timestamp, temperature) VALUES (2000, 25.0); INSERT INTO `root.csgg.d2`(timestamp, temperature) VALUES (4000, 26.0); INSERT INTO `root.csgg.d3`(timestamp, temperature) VALUES (1500, 18.0); INSERT INTO `root.csgg.d3`(timestamp, temperature) VALUES (3500, 19.0);
问题现象
执行带别名的分组查询:
SELECT avg(temperature) as avg_temp FROM `root.csgg`.** GROUP BY ([0, 5000), 2s);
返回错误:
Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 701: alias 'avg_temp' can only be matched with one `time` series
移除别名后执行查询(注意此处路径拼写错误:root.factory应为root.csgg):
SELECT avg(temperature) FROM `root.factory`.** GROUP BY ([0, 5000), 2s);
返回结果为各设备单独按窗口计算平均值,不符合预期:
+-----------------------------+--------------------------------+--------------------------------+--------------------------------+ | `Time` | avg(`root.factory.d1.temperature`) | avg(`root.factory.d2.temperature`) | avg(`root.factory.d3.temperature`) | +-----------------------------+--------------------------------+--------------------------------+--------------------------------+ |1970-01-01T08:00:00.000+08:00| 20.0 | 30.0 | 18.0 | |1970-01-01T08:00:02.000+08:00| 24.0 | 28.0 | 19.0 | |1970-01-01T08:00:04.000+08:00| `null` | 26.0 | `null` | +-----------------------------+--------------------------------+--------------------------------+--------------------------------+
预期输出
希望每个时间窗口内汇总所有设备的温度值,计算全局平均值:
+-----------------------------+------------------+ | `Time` | avg_temp | +-----------------------------+------------------+ |1970-01-01T08:00:00.000+08:00| 20.0 | -- [0,2000)窗口仅d1有数据:20.0 |1970-01-01T08:00:02.000+08:00|21.666666666666668| -- [2000,4000)窗口包含d1=22.0、d2=25.0、d3=18.0,平均值=(22+25+18)/3≈21.67 |1970-01-01T08:00:04.000+08:00| 22.5 | -- [4000,6000)窗口包含d2=26.0、d3=19.0,平均值=(26+19)/2=22.5 +-----------------------------+------------------+
解决方案
使用IoTDB的AGGREGATE BY语法指定全局聚合层级,将root.csgg下所有设备的temperature数据合并到同一窗口计算平均值:
正确SQL语句:
SELECT avg(temperature) AS avg_temp FROM `root.csgg`.** GROUP BY TIME([0, 5000), 2s) AGGREGATE BY LEVEL = 'root.csgg';
语法说明
GROUP BY TIME([0, 5000), 2s):定义时间窗口的范围(0到5000毫秒)和步长(2秒)。AGGREGATE BY LEVEL = 'root.csgg':指定在root.csgg节点层级进行全局聚合,该节点下所有子设备的同类型测点数据会被合并,在每个时间窗口内统一计算平均值,而非按设备单独计算。
执行该语句后,即可得到符合预期的全局窗口平均值结果。
内容的提问来源于stack exchange,提问作者yana shen
相关产品推荐
相关产品推荐

