2013-01-23 16 views
1

我有如下表的順序編號:數據序列

create table test_seq (id int, obs int); 
insert into test_seq values (1,1); 
insert into test_seq values (2,1); 
insert into test_seq values (3,1); 
insert into test_seq values (4,0); 
insert into test_seq values (5,0); 
insert into test_seq values (6,1); 
insert into test_seq values (7,1); 
insert into test_seq values (8,0); 
insert into test_seq values (9,0); 
insert into test_seq values (10,1); 
insert into test_seq values (11,0); 

有s^SQL的方式,如何創建下面的輸出?

id obs seq_num 
1  1   1 
2  1   1 
3  1   1 
4  0   2 
5  0   2 
6  1   3 
7  1   3 
8  0   4 
9  0   4 
10  1   5 
11  0   6 

與上一行(按ID排序)相比,每次列obs中的值發生更改時,seq_num都會增加1。我可以很容易地在Excel中解決這個問題(使用簡單的公式),但無法在postgres中找出它。

+0

看到堆棧類似的答案http://stackoverflow.com/questions/3397121/how-顯示行號在Postgresql查詢 – xQbert

回答

2

,是這樣的:

select id, obs, sum(cnt) over (order by id) as seq_num 
from (
    select id, obs, case when obs <> (lag(obs) over (order by id)) then 1 else 0 end as cnt 
    from test_seq 
) 
order by id; 
0

您可以使用rownumber來做到這一點。

+0

請解釋我可以如何使用row_number()來做到這一點。 –

1

我已經想通了:使用分析功能

with t as (
    select 
     id, 
     obs, 
     case when lag(obs,1) over (order by id) <> obs then 1 else 0 end as test 
    from 
     tmp.test_seq 
    ) 

select 
    *, 
    sum(test) over (order by id rows between unbounded preceding and current row) + 1 
from 
    t