选择上一行发生更改的记录

时间:2018-06-19 10:49:02

标签: sql postgresql

我有一个名为test的psql表,其中包含三个属性列。第一种类型是整数,第二种是字符,第三种是整数

我的目标只是选择状态从AB更改为C的记录 - 换句话说,当前状态为C且之前的状态为AB,按id排序并记录编号。

如何在psql中编写这样的查询?

 id state record
  1     C      1
  1     A      2
  1     C      3
  1     A      4
  1     C      5
  1     A      6
  1     B      7
  2     C      8
  2     C      9
  2     C     10
  2     B     11
  2     C     12
  2     C     13
  2     C     14
  3     A     15
  3     C     16
  3     B     17
  3     A     18
  3     A     19
  3     A     20
  3     A     21
  3     C     22
  3     A     23
  3     B     24
  3     B     25

在上面的表上选择将返回如下内容:

id state record
  1     C      3
  1     C      5
  2     C     12
  3     C     16
  3     C     22

1 个答案:

答案 0 :(得分:6)

一种方法使用lag()

select t.*
from (select t.*, lag(t.state) over (partition by t.id order by t.record) as prev_state
      from t
     ) t
where t.state = 'C' and prev_state in ('A', 'B');

另一个人使用自我加入:

select t.*
from t join
     t tprev
     on t.id = tprev.id and t.record = t.record + 1
where t.state = 'C' and tprev.state in ('A', 'B')