简体   繁体   English

数据序列的顺序编号

[英]Sequential numbering of data sequence

I do have the following table: 我有下表:

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

Is there s SQL way, how to create the following output? 有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

seq_num is increased by 1 every time when value in column obs is changed compared to the previous row (ordered by id). 每当列obs中的值与前一行(按id排序)相比更改时,seq_num增加1。 I can solve this easily in Excel (using simple if formula), but can't figure out this in postgres. 我可以在Excel中轻松解决这个问题(使用简单的if公式),但在postgres中无法弄清楚这一点。

using analytic functions, something like : 使用分析函数,如:

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;

I've figured it out: 我弄清楚了:

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

你可以使用rownumber来做到这一点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM