JSON 字段上的时间刻度 DB 插值

Timescale DB interpolation on JSON fields

我目前正在从事一个项目,该项目将 IOT 信息存储为 JSON 在 Postgresql 中,我决定使用时间刻度扩展,因为我需要一些功能,例如在组件出现故障时进行插值大约一个小时或者。我试图将我的数据划分为 1 小时的存储桶,并且字段值是 JSON 字段中的键之一,但无济于事。当我使用 time_bucket_gapfill 函数时,你能帮我得到非常不可预测的时间段吗 这是我的查询

SELECT
    time_bucket_gapfill(
        '1 hour ', module_timestamp,
        start => '2020-04-20 15:00',
        finish => '2020-04-21 17:00') AS hour,
    interpolate(CAST(component_data->'common'->'bat' AS INT)) AS avg_val
FROM main_componentmessage order by hour;

这是我得到的结果

          hour          | avg_val 
------------------------+---------      
 2020-03-10 09:00:00+00 |      30
 2020-04-20 17:00:00+00 |        
 2020-04-20 18:00:00+00 |      50

我不明白为什么start参数没有作为上限,我不明白为什么中间行没有插值到40

time_bucket_gapfill 旨在与聚合一起使用,因为您将值分桶到指定的分桶宽度中。我不确定为什么它不抛出错误。但是关于您的查询,您可以按以下方式使用它和 interpolate

SELECT 
  time_bucket_gapfill(
    '1 hour', time, 
    start=> '2020-04-20 15:00', 
    finish => '2020-04-20 17:00') as hour,
  interpolate(
    avg((val->'common'->'bat')::integer)
  )
FROM main_componentmessage
GROUP BY 1;

请注意,对于 2020-04-20 17:00:00+00 桶,插值不会产生 40。插值考虑了前一个可用值 (30) 和下一个 (50),但也考虑了它们之间的时间距离(约一个月)。因此,如果桶位于 4 月 20 日和 3 月 10 日之间的中间,您将获得 40 的插值。但是由于桶非常接近 4 月 20 日 18:00 插值将非常接近 50。

查看 API https://docs.timescale.com/latest/api#interpolate 了解如何为上一个和下一个值指定您自己的计算,以便您可以根据需要进行调整