Я пытаюсь использовать функцию 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