(PostgreSQL 8.4) Я получил отличное представление о пробелах и островах SQL здесь, в Stack Overflow, но у меня все еще есть вопрос. Многие 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 поворотов OFF -- правильно завершает последовательность, игнорируя строку
11 включается -- OK, новая последовательность, включить в SELECT
11 включается -- дублировать, игнорировать строку
10 выключено -- #10 не было включено, игнорировать
12 включается -- OK, неявно выключается #11, включается в SELECT
13 включается -- ОК, неявно выключается #12, включается в SELECT
13 выключается -- правильно завершает последовательность, игнорируя строку
13 включается -- OK, новая последовательность, включить в SELECT
По сути, одновременно может быть включено только одно устройство, и условие прерывания таково:
- new.val = running.val AND new.status = 0
- new.val ‹› running.val AND new.status = 1
Я ищу что-нибудь в виде CTE, без курсоров, пожалуйста.
OFF
строки. - person Clockwork-Muse   schedule 18.09.2012