我正在尝试编写一个查询以根据一个字段选择连续 block 以将其转换为状态更改记录。基本上我只需要选择一个“v1”,如果相同的值在基于 id 排序时多次出现。 让我们假设下表:
| id | v1 | v2 | v3 |
---------------------
|1 | a | b | b |
|2 | a | e | b |
|3 | z | b | b |
|4 | z | o | p |
|5 | a | h | t |
|6 | a | i | k |
|7 | b | g | p |
期望的结果:
|time sequence | state |
----------------------------
|1 | a |
|2 | z |
|3 | a |
|4 | b |
任何机构有任何想法?
最佳答案
使用 window function , lag()
在这种情况下。
此查询查找系列的开头:
select id, v1, v1 is distinct from lag(v1) over (order by id) as start
from my_table
id | v1 | start
----+----+-------
1 | a | t
2 | a | f
3 | z | t
4 | z | f
5 | a | t
6 | a | f
7 | b | t
(7 rows)
仅选择 start = true
的行并添加行号:
select row_number() over (order by id) as sequence, v1 as state
from (
select id, v1, v1 is distinct from lag(v1) over (order by id) as start
from my_table
) s
where start
sequence | state
----------+-------
1 | a
2 | z
3 | a
4 | b
(4 rows)
关于sql - 从表的数据中提取顺序状态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44578922/