Как использовать функцию задержки окна для разделения данных на несколько типов датчиков - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь использовать функцию LAG postgres для вычисления разницы в абсолютном времени между двумя датами выборки для каждого датчика в системе.

Лучшее, что я придумал, - это использование функции WINDOW LAG для вычисления разницы с предыдущей строкой. Однако есть две проблемы с этим. Первое значение всегда равно нулю. Я думаю, я могу решить эту проблему с помощью функции CASE. Во-вторых, он не принимает каждое значение датчика явно.

SELECT 
    seq_id, stream_id, sensor, "timestamp", oper_value 
    "timestamp" - LAG("timestamp",1) OVER (ORDER BY "timestamp") delta
    FROM public.mt_events
    where "type" = 'operational_value_event'
    limit 100;

Данные регистрируются при нарушении порога (включая гистерезис), и поэтому некоторые значения изменяются чаще, чем другие. При регистрации данных нет фиксированных интервалов.

Конечная цель - получить значение, которое имеет определенную разницу во времени.

Пример данных:

id stream_id sensor oper_value timestamp
44 100000000    GT1         17 2018-05-16 13:36:21.899821+00
45 100000000    GT2         44 2018-05-16 14:36:21.000000+00
88 100000000    GT1         26 2018-05-18 12:33:22.000000+00
94 100000000    GT1         99 2018-05-18 12:33:23.002000+00

Например, если выборка данных с разницей во времени не менее 5 минут, я хотел бы получить следующие значения:

id stream_id sensor oper_value timestamp
44 100000000    GT1         17 2018-05-16 13:36:21.899821+00
45 100000000    GT2         44 2018-05-16 14:36:21.000000+00
88 100000000    GT1         26 2018-05-18 12:33:22.000000+00

Последний GT1 отфильтровывается, поскольку разница составляла менее 5 минут.

Есть ли способ сделать это эффективно с помощью оператора SQL или мне нужно написать хранимую процедуру?

Ура, Mario

1 Ответ

0 голосов
/ 04 июля 2018

Вы можете использовать форму с тремя аргументами lag() с partition by:

("timestamp" -
 LAG("timestamp", 1, "timestamp") OVER (PARTITION BY sensor ORDER BY "timestamp")
) as delta

Для вашей конечной проблемы значение NULL для первой строки не имеет значения. Вы можете решить проблему, используя подзапрос:

select *
from (select seq_id, stream_id, sensor, "timestamp", oper_value ,
             lag("timestamp") over (partition by sensor order by timestamp) as prev_timestamp
      from public.mt_events
      where "type" = 'operational_value_event'
     ) t
where delta is null or
      prev_timestamp < timestamp - interval '5 minute';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...