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 了解如何为上一个和下一个值指定您自己的计算,以便您可以根据需要进行调整
我目前正在从事一个项目,该项目将 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 了解如何为上一个和下一个值指定您自己的计算,以便您可以根据需要进行调整