2017-06-16 3 views
1

Ich versuche, eine Abfrage zu schreiben, um Blöcke basierend auf einem Feld zu aktivieren, um sie in Statusänderungsdatensätze umzuwandeln. im Grunde muss ich nur eine "v1" auswählen, wenn der gleiche Wert mehrere Male kommt, während er auf der Basis der ID geordnet ist. lassen Sie uns die folgende Tabelle übernehmen:Extrahieren von sequenziellen Statusänderungen aus den Daten einer Tabelle

| 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 | 

gewünschten Ergebnisse:

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

jeder Körper eine Idee hat?

Antwort

2

Verwenden Sie in diesem Fall eine window function, lag().

Diese Abfrage findet beginnt der Serie:

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) 

Wählen Sie nur die Zeilen mit start = true und Zeilennummern hinzufügen:

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)  
Verwandte Themen