我有一个名为test
的psql表,其中包含三个属性列。第一种类型是整数,第二种是字符,第三种是整数
我的目标只是选择状态从A
或B
更改为C
的记录 - 换句话说,当前状态为C
且之前的状态为A
或B
,按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
答案 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')