Временная интерполяция БД по полям JSON - PullRequest
2 голосов
/ 21 апреля 2020

В настоящее время я работаю над проектом, в котором информация 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

1 Ответ

3 голосов
/ 21 апреля 2020

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;

Обратите внимание, что интерполяция не приведет к 40 для сегмента 2020-04-20 17:00:00+00. Интерполяция учитывает предыдущее доступное значение (30) и следующее (50), но также учитывает временное расстояние между ними (~ месяц). Таким образом, вы получите интерполяцию 40, если ведро находится в середине между 20 апреля и 10 марта. Но так как интервал очень близок к 20 апреля 18:00, интерполированное значение будет очень близко к 50.

Проверьте API https://docs.timescale.com/latest/api#interpolate, чтобы увидеть, как вы можете указать свой собственный расчет для предыдущего и следующего значения, так что вы можете настроить его, как вам нравится

...