2016-07-13 21 views
1

私はシステムが特定の状態にあるすべての期間を見つけようとしています。状態はテーブルに記録されます。次のようにデータの例は次のとおりです。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 

は遷移レコードを見つけるために事前定義された機能はありますか?このような

答えて

2

何か作業をする必要があります:

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値を持つ連続したレコードのを識別するために、標準的な技術を使用しています。外部クエリは計算列grpGROUP BYを使用し、Start,Endの値をそれぞれとします。

+0

これはまさに私が望んでいたものです。すばらしいです! –