数据序列的顺序编号
Posted
技术标签:
【中文标题】数据序列的顺序编号【英文标题】: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 中无法解决。
【问题讨论】:
在堆栈上查看类似的答案***.com/questions/3397121/… 【参考方案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() 来做到这一点。以上是关于数据序列的顺序编号的主要内容,如果未能解决你的问题,请参考以下文章