(PostgreSQL 8.4)ここStack OverflowでSQLのギャップと島についてのすばらしい紹介がありましたが、まだ質問があります。多くのアイランド検出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がオンになります-OK、新しいシーケンス、SELECTに含める
10がオフになります-シーケンスを適切に終了し、行を無視します
11がオンになります-OK、新しいシーケンス、SELECTに含めます
11がオンになります-重複し、行を無視します
10がオフになります-#10はオンになりませんでした、無視してください
12がオンになります-OK、暗黙的にオフになります#11、SELECTに含めます
13がオンになります-OK、暗黙的にオフになります#12、SELECTに含めます
13がオフになります-シーケンスを適切に終了し、行を無視します
13がオンになります-OK、新しいシーケンス、SELECTに含める
基本的に、一度にオンにできるデバイスは1つだけであり、「ブレーク」状態は次のとおりです。
- new.val = running.val AND new.status = 0
- new.val <> running.val AND new.status = 1
CTEの形で何かを探しています。カーソルはありません。