【发布时间】:2014-07-28 17:39:15
【问题描述】:
假设我们有一张桌子:
CREATE TABLE p
(
id serial NOT NULL,
val boolean NOT NULL,
PRIMARY KEY (id)
);
填充了一些行:
insert into p (val)
values (true),(false),(false),(true),(true),(true),(false);
标识值
1 1
2 0
3 0
4 1
5 1
6 1
7 0
我想确定值何时更改。所以我的查询结果应该是:
标识值 2 0 4 1 7 0我有一个连接和子查询的解决方案:
select min(id) id, val from
(
select p1.id, p1.val, max(p2.id) last_prev
from p p1
join p p2
on p2.id < p1.id and p2.val != p1.val
group by p1.id, p1.val
) tmp
group by val, last_prev
order by id;
但它的效率非常低,并且对于有很多行的表来说会非常慢。
我相信使用 PostgreSQL 窗口函数可以有更有效的解决方案?
【问题讨论】:
-
您是否会认为 第一行 中的值从以前的“未知”或“无”“更改”?
标签: sql postgresql window-functions gaps-and-islands