sql - 从表的数据中提取顺序状态变化

标签 sql database postgresql

我正在尝试编写一个查询以根据一个字段选择连续 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/

相关文章:

mysql - mysql中的过程更新查询优化

jquery - 删除数据表中的行

sql - 计算两个日期之间的差异

c# - int 与 datetime2 不兼容

javascript - 如何将数组的值附加到 Javascript 中的 SQL 语句

sql - 生成下一个主键值

django - Postgres int数组与中间表来保存访问控制列表的用户ID

postgresql - Postgres : Count number of users actions within time interval

postgresql - 同一张表中 COUNT 的 SUM

postgresql - 如何检查postgres用户和密码?