按设备对齐(ALIGN BY DEVICE)后,LIMIT为什么不返回每个设备的N 行?
我想在Apache IoTDB 2.0.8的树模型中为每个设备获取最新的两行load_amp数据,因此对通配设备执行ALIGN BY DEVICE,并加入ORDER BY TIME DESC LIMIT 2。结果只是全局层面上的最新两行,而不是每个设备的两行。
时序数据定义与示例行:
CREATE TIMESERIES root.sg1.device_limit.unitA.load_amp WITH DATATYPE=DOUBLE, ENCODING=PLAIN;
CREATE TIMESERIES root.sg1.device_limit.unitB.load_amp WITH DATATYPE=DOUBLE, ENCODING=PLAIN;
INSERT INTO root.sg1.device_limit.unitA(timestamp, load_amp) VALUES (1000, 10.0);
INSERT INTO root.sg1.device_limit.unitA(timestamp, load_amp) VALUES (3000, 30.0);
INSERT INTO root.sg1.device_limit.unitB(timestamp, load_amp) VALUES (2000, 20.0);
INSERT INTO root.sg1.device_limit.unitB(timestamp, load_amp) VALUES (4000, 40.0);
按设备对齐、按时间降序排序,然后限制为2 行:
SELECT load_amp
FROM root.sg1.device_limit.*
ORDER BY TIME DESC
LIMIT 2 ALIGN BY DEVICE;
查询输出:
| 时间 | 设备 | load_amp |
|---|---|---|
| 1970-01-01T08:00:04.000+08:00 | root.sg1.device_limit.unitB | 40.0 |
| 1970-01-01T08:00:03.000+08:00 | root.sg1.device_limit.unitA | 30.0 |
控制查询:不按时间排序时限制为2 行:
SELECT load_amp
FROM root.sg1.device_limit.*
LIMIT 2 ALIGN BY DEVICE;
输出:
| 时间 | 设备 | load_amp |
|---|---|---|
| 1970-01-01T08:00:01.000+08:00 | root.sg1.device_limit.unitA | 10.0 |
| 1970-01-01T08:00:03.000+08:00 | root.sg1.device_limit.unitA | 30.0 |
我的问题:
在ALIGN BY DEVICE之后,LIMIT是应用于整个对齐结果集,而不是按设备取N 行吗?如果我需要每个设备的最新两行,是需要分别对每个设备执行查询,还是需要另一种能够表达“每个设备前N 条”的查询模型?
解决方案
这是预期的行为。ALIGN BY DEVICE 不会使 LIMIT 分别应用到每个设备。首先,查询会构建一个单一的对齐结果集,然后应用 ORDER BY,最后 LIMIT,因此你只能从合并后的结果中得到前两行。
我第一次使用 ALIGN BY DEVICE 时也遇到了同样的困惑,因为很容易以为limit是对每个设备单独计算的,但实际并非如此。
如果你需要每个设备的最新两行,我认为2.0.8的树模型SQL没有内置的“每个设备前N 条”查询。通常的做法是逐个查询每个设备,或获取更大的结果集,然后在应用程序中对其进行分组/筛选。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。