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

次の出力を作成する方法はありますか?

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

seq_num は、列 obs の値が前の行 (id 順) と比較して変更されるたびに 1 ずつ増加します。これは Excel で簡単に解決できます (単純な if 式を使用) が、postgres ではこれを理解できません。

4

3 に答える 3

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;
于 2013-01-23T13:23:51.003 に答える
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
于 2013-01-23T13:23:42.473 に答える
0

これを行うには、 rownumberを使用できます。

于 2013-01-23T13:18:13.980 に答える