2017-06-16 18 views
1

我正在嘗試編寫一個查詢來選擇基於一個字段的繼續塊以將其轉換爲狀態更改記錄。基本上我需要選擇只有一個「v1」,如果相同的值多次出現,而基於ID排序。 假設如下表:從表格數據中提取順序狀態更改

| 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)  
相關問題