Apache IoTDB date_bin用1mo+1d间隔报错的技术问询
自定义计费周期的IoTDB CPU指标聚合需求
场景说明
需分析服务器CPU指标,采用非日历月的自定义计费周期:每个周期为「1整月加1天」,例如从1月15日到2月16日,下一个周期从2月16日到3月17日,以此类推。
环境:Apache IoTDB 2.0.6,单机部署
样本数据
CREATE TABLE device_metrics( `time` TIMESTAMP `TIME`, device_id STRING TAG, cpu_usage FLOAT FIELD ); INSERT INTO device_metrics VALUES ('2024-01-15T10:00:00', 'server_01', 45.2), -- billing period 1 start ('2024-01-31T10:00:00', 'server_01', 50.5), ('2024-02-01T10:00:00', 'server_01', 48.0), ('2024-02-15T10:00:00', 'server_01', 52.3), -- billing period 1 end ('2024-02-16T10:00:00', 'server_01', 47.8), -- billing period 2 start ('2024-03-01T10:00:00', 'server_01', 49.5);
已尝试的方案及问题
方案1:混合单位间隔字符串
尝试用'1mo 1d'表示自定义间隔,执行SQL:
SELECT date_bin('1mo 1d', `time`) as time_bin, avg(cpu_usage) as avg_cpu FROM device_metrics `GROUP BY` date_bin('1mo 1d', `time`);
返回语法错误:
Msg: org.apache.iotdb.jdbc.IoTDBSQLException: 700: line 1:17: mismatched input ''1mo 1d''. Expecting: <integer>
方案2:嵌套date_bin调用
尝试先按月份取整再添加1天偏移,执行SQL:
SELECT date_bin(1d, date_bin(1mo, `time`)) as time_bin, avg(cpu_usage) as avg_cpu FROM device_metrics `GROUP BY` date_bin(1d, date_bin(1mo, `time`));
语句可执行,但结果不符合需求——数据被聚合到日历月起始日,+1天的偏移未生效:
+-----------------------------+-----------------+ | time_bin| avg_cpu| +-----------------------------+-----------------+ |2024-01-01T08:00:00.000+08:00|47.85000038146973| |2024-02-01T08:00:00.000+08:00|49.36666615804037| |2024-03-01T08:00:00.000+08:00| 49.5| +-----------------------------+-----------------+
预期分组结果
| Window Start | Window End | Data Points Included | Expected Avg CPU |
|---|---|---|---|
| 2024-01-15 | 2024-02-16 | Jan 15, Jan 31, Feb 1, Feb 15 | ~49.0 |
| 2024-02-16 | 2024-03-17 | Feb 16, Mar 1 | ~48.7 |
疑问
是否存在IoTDB SQL原生方法(比如未公开的语法或函数变体)能实现上述自定义周期的聚合需求?
内容的提问来源于stack exchange,提问作者何乐怡




