TimescaleDB中使用LOCF计算24小时时间加权平均结果异常求助
问题原因分析
你的查询结果不符合预期,核心原因在于TimescaleDB的time_weight('locf', ...)函数的行为特性:
- LOCF(Last Observation Carried Forward)模式下,函数只会将最后一个观测值持续到下一个实际存在的数据点,不会自动延伸到查询窗口或
time_bucket的结束时间。 - 你的数据中最后一个有效点是
2020-01-01 23:00:00,窗口结束时间为2020-01-02 00:00:00,但此区间内没有后续数据点,因此time_weight仅计算了00:00:00到23:00:00这23小时的区间(值为1),完全忽略了23:00:00到00:00:00的1小时区间,最终加权平均结果为1。
解决方法
要让函数覆盖整个24小时区间,需要手动添加一个窗口结束时间的虚拟数据点,值取最后一个观测值。以下是修改后的查询:
WITH extended_data AS ( SELECT time, value FROM series_points_float WHERE time BETWEEN TIMESTAMP '2020-01-01 00:00:00+00:00' AND TIMESTAMP '2020-01-02 00:00:00+00:00' UNION ALL -- 添加窗口结束时间的虚拟点,值为最后一个观测值 SELECT TIMESTAMP '2020-01-02 00:00:00+00:00', (SELECT value FROM series_points_float WHERE time <= TIMESTAMP '2020-01-02 00:00:00+00:00' ORDER BY time DESC LIMIT 1) ) SELECT time_bucket('1 days', time) AS timebucket, average(time_weight('locf', time, value)) AS weighted_avg FROM extended_data GROUP BY timebucket;
此查询会将23:00:00到00:00:00的1小时区间纳入计算,最终结果与手动计算的42.625一致。
内容的提问来源于stack exchange,提问作者Tim Seegmüller
相关产品推荐
相关产品推荐

