【问题标题】:Sequential numbering of data sequence数据序列的顺序编号
【发布时间】:2013-01-23 13:15:35
【问题描述】:

我确实有下表:

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

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

当 obs 列中的值与前一行相比发生变化时,seq_num 每次增加 1(按 id 排序)。我可以在 Excel 中轻松解决这个问题(使用简单的 if 公式),但在 postgres 中无法解决。

【问题讨论】:

标签: sql postgresql


【解决方案1】:

使用分析函数,例如:

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;

【讨论】:

    【解决方案2】:

    我想通了:

    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
    

    【讨论】:

      【解决方案3】:

      您可以使用rownumber 来执行此操作。

      【讨论】:

      • 请解释我如何使用 row_number() 来做到这一点。
      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多