sql - 数据序列的顺序编号

标签 sql postgresql

我确实有下表:

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 列中的值与上一行(按 id 排序)相比发生变化时,seq_num 增加 1。我可以在 Excel 中轻松解决这个问题(使用简单的 if 公式),但无法在 postgres 中解决这个问题。

最佳答案

使用分析函数,比如:

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;

关于sql - 数据序列的顺序编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480625/

相关文章:

postgresql - SQLAlchemy、postgres 继承多主键列的模型

java - 地理上分散的服务器、PostgreSQL 和 JPA

python - SQL炼金术。 tuple _ func in queries 和 None 值

SQL Server 2008 错误 233

mysql - 如何将 MySQL 行设置为只读?

java - Android 检索手机联系人查询需要很长时间

Postgresql 9.4 级联复制故障转移

sql - 数据库是单线程的吗?

MySQL 更新和 Case 语句错误

ruby - 续集,传值给pg_array查询