2017-06-16 12 views
1

選択するクエリを書き込もうとすると、1つのフィールドに基づいてブロックを継続してステート変更レコードに変換します。基本的に私は同じ値がidに基づいて順序付けられている間に複数回来る場合、ただ1つの "v1"を選択する必要があります。 のは、次の表を想定してみましょう:テーブルのデータからシーケンシャルステートの変更を抽出する

| id | v1 | v2 | v3 | 
--------------------- 
|1 | a | b | b | 
|2 | a | e | b | 
|3 | z | b | b | 
|4 | z | o | p | 
|5 | a | h | t | 
|6 | a | i | k | 
|7 | b | g | p | 

望ましい結果:

|time sequence | state | 
---------------------------- 
|1    | a  | 
|2    | z  | 
|3    | a  | 
|4    | b  | 

すべてのボディは、任意のアイデアを持っていますか?

答えて

2

この場合、window function,lag()を使用してください。

このクエリは、一連の開始見つける:

select id, v1, v1 is distinct from lag(v1) over (order by id) as start 
from my_table 

id | v1 | start 
----+----+------- 
    1 | a | t 
    2 | a | f 
    3 | z | t 
    4 | z | f 
    5 | a | t 
    6 | a | f 
    7 | b | t 
(7 rows) 

start = true持つ行のみを選択し、行番号を追加します。

select row_number() over (order by id) as sequence, v1 as state 
from (
    select id, v1, v1 is distinct from lag(v1) over (order by id) as start 
    from my_table 
    ) s 
where start 

sequence | state 
----------+------- 
     1 | a 
     2 | z 
     3 | a 
     4 | b 
(4 rows)  
関連する問題