Postgres найти переходы
Я пытаюсь найти все периоды времени, когда система находится в определенном состоянии. Состояние заносится в таблицу. Пример данных выглядит следующим образом:
Time - State
12:00 - 1
12:01 - 1
12:02 - 1
12:03 - 1
12:04 - 0
12:05 - 0
12:06 - 0
12:07 - 1
12:08 - 1
Результат, который я хотел бы видеть:
Start - End - State
12:00 - 12:03 - 1
12:04 - 12:06 - 0
12:07 - 12:08 - 1
Есть ли предопределенная функция для поиска записей перехода?
1 ответ
Решение
Примерно так должно работать:
SELECT "State",
MIN("Time") AS Start,
MAX("Time") AS End
FROM (
SELECT "Time", "State",
ROW_NUMBER() OVER (ORDER BY "Time") -
ROW_NUMBER() OVER (PARTITION BY "State" ORDER BY "Time") AS grp
FROM mytable) AS t
GROUP BY "State", grp
Внутренний запрос использует стандартную технику для идентификации островков последовательных записей, имеющих одинаковые State
значение. Внешний запрос использует вычисляемый столбец grp
в GROUP BY
и получить Start
, End
ценности каждого острова.