Это звучит как основная проблема пропусков и островов, когда вы хотите найти только первый остров. Подобные вещи легко решить с помощью оконных функций, добавленных в sqlite 3.25 (и поэтому этот ответ не будет работать с более старыми версиями).
Учитывая эту таблицу:
CREATE TABLE test(id INTEGER PRIMARY KEY, a INTEGER, b INTEGER);
INSERT INTO test VALUES(1,6,5);
INSERT INTO test VALUES(2,3,2);
INSERT INTO test VALUES(3,5,1);
INSERT INTO test VALUES(4,5,5);
INSERT INTO test VALUES(5,9,8);
INSERT INTO test VALUES(6,1,7);
этот запрос:
WITH islands AS
(SELECT id, a, b
, row_number() OVER (PARTITION BY a - b > 0 ORDER BY id) AS isle_rn
FROM test)
SELECT id, a, b
FROM islands
WHERE id = isle_rn AND a - b > 0
ORDER BY id;
производит
id a b
---------- ---------- ----------
1 6 5
2 3 2
3 5 1
По сути, он разбивает таблицу на два раздела: те, где a - b > 0
- это истина, и те, где она - ложь. Каждый раздел сортируется по id
, и каждая строка затем нумеруется. Наконец, возвращаются только те строки, в которых это число равно id
- первая строка, где условие ложно, приведет к тому, что все последующие строки, для которых верно, имеют разные id и номер строки. Дополнительная проверка, что a - b > 0
существует, чтобы поймать случай, когда id 1 является ложным, и никакие строки, таким образом, не должны быть возвращены.
Предполагается, что id
всегда начинается с 1 и не имеет пробелов. Если это не так, этот вариант добавляет порядковый номер строки, который используется вместо id
:
WITH islands AS
(SELECT id, a, b
, row_number() OVER (ORDER BY id) AS rn
, row_number() OVER (PARTITION BY a - b > 0 ORDER BY id) AS isle_rn
FROM test)
SELECT id, a, b
FROM islands
WHERE isle_rn = rn AND a - b > 0
ORDER BY id;