(PostgreSQL 8.4)我在 Stack Overflow 上对 SQL gaps-and-islands 有了很好的介绍,但我仍然有一个问题。许多孤岛检测 CTE 基于时间戳的运行顺序和一些标志,当它改变时会破坏序列。但是如果“中断”条件稍微复杂一点呢?
CREATE TABLE T1
(
id SERIAL PRIMARY KEY,
val INT, -- some device
status INT -- 0=OFF, 1=ON
);
INSERT INTO T1 (val, status) VALUES (10, 1);
INSERT INTO T1 (val, status) VALUES (10, 0);
INSERT INTO T1 (val, status) VALUES (11, 1);
INSERT INTO T1 (val, status) VALUES (11, 1);
INSERT INTO T1 (val, status) VALUES (10, 0);
INSERT INTO T1 (val, status) VALUES (12, 1);
INSERT INTO T1 (val, status) VALUES (13, 1);
INSERT INTO T1 (val, status) VALUES (13, 0);
INSERT INTO T1 (val, status) VALUES (13, 1);
在这种情况下,val
表示一个设备,并且status
是ON
或OFF
。我想使用以下逻辑选择记录1
、、、3
和6
。7
9
10 次打开 -- 好的,新序列,包含在 SELECT 中
10 关闭 - 正确结束序列,忽略行
11 开启 -- 好的,新序列,包含在 SELECT 中
11 开启——重复,忽略行
10 关闭——#10 没有打开,忽略
12 打开 -- 好的,隐式关闭 #11,包含在 SELECT 中
13 打开 -- 好的,隐式关闭 #12,包含在 SELECT 中
13 关闭——正确结束序列,忽略行
13 开启 -- 好的,新序列,包含在 SELECT 中
基本上,一次只能开启一个设备,“中断”条件是:
- new.val = running.val AND new.status = 0
- new.val <> running.val AND new.status = 1
我正在寻找 CTE 形式的东西,请不要使用光标。