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 ценности каждого острова.

Другие вопросы по тегам