Вопрос 1a: Есть ли способ поиска 3 или более последовательных строк, соответствующих заданному значению (например, 3, 29, 88)
Я полагаю, что следующий пример показывает: -
DROP TABLE IF EXISTS xtable;
CREATE TABLE IF NOT EXISTS xtable (id INTEGER PRIMARY KEY, myint INTEGER);
WITH RECURSIVE cte1 AS (SELECT abs(random()) % 101
UNION ALL SELECT abs(random()) % 101 FROM cte1 LIMIT 500)
INSERT INTO xtable (myint) SELECT * FROM cte1;
-- RESULT 1
SELECT * FROM xtable ORDER BY myint;
-- RESULT 2
SELECT * FROM xtable WHERE myint IN (3,29,88,99,100,77,52,21) GROUP BY myint HAVING count(myint) >= 3 ORDER BY id;
Обратите внимание, что xtable заполняется 500 строками со случайными числами от 0 до 100 в столбце myint , который соответствует вашему второму столбцу.Таким образом, результаты меняются при каждом запуске.
3,29,88,99,100,77,52,21 - ваш список заданных значений (дополнительнодобавлены номера, чтобы получить больше просмотров).
WHERE myint IN(....)
ограничит выбранные строки только теми, которые в списке.
GROUP BY myint
эффективно создает 1строка для каждого уникального значения в столбце myint , что позволяет использовать агрегатные функции, такие как count . SQL в понимании SQLite - агрегатные функции HAVING
является своего рода после факта WHERE, поэтому HAVING count(myint) >= 3
ограничивает вывод строк теми, у которых количество равно 3 или более. ORDER BY id
, может потребоваться или не потребоваться, но может подойти для последующих вопросов.
Результатом вышесказанного может быть: -

Вопрос 1b: Есть ли способ получить следующее значение (запись), которое следует за 3 или более записями в последовательном порядке.
Если вы имеете в виду, что следующим значением является следующий первичный ключ, то если первичный ключ представляет собой целое число и , это псевдоним rowid и не было удаленийнеудачные обновления (создание временной таблицы может преодолеть эти ограничения), тогда может быть достаточно следующего: -
WITH cte1 AS (SELECT *, max(id) AS maxid FROM xtable WHERE myint IN (3,29,88,99,100,77,52,21) GROUP BY myint HAVING count(myint) >= 3 ORDER BY id DESC)
SELECT * FROM xtable, cte1 WHERE maxid + 1 = xtable.id ORDER BY xtable.id;
;
- При этом используется первый запрос для определения 3 или более последовательных строк (в качестве общей таблицы).Выражение), берет его основной и добавляет 1, чтобы затем выбратьстрока со следующим первичным ключом.
Это, например, приведет к: -

на основе (строка спервичный ключ 359) согласно: -

Вопрос 1c: если база данных содержит более 1 совпадения в последовательном порядке, показать всеследующее значение (запись) в последовательном порядке в порядке убывания «первичного ключа»
Это может быть тем, что вы просите (в основном, выше, но для> 1 последовательных чисел и упорядочено по первичному ключу)в порядке убывания)
WITH cte1 AS (SELECT *, max(id) AS maxid FROM xtable WHERE myint IN (3,29,88,99,100,77,52,21) GROUP BY myint HAVING count(myint) > 1 ORDER BY id DESC)
SELECT * FROM xtable, cte1 WHERE maxid + 1 = xtable.id ORDER BY xtable.id DESC;
;
Хотя вы могли бы иметь в виду: -
WITH cte1 AS (SELECT *, max(id) AS maxid FROM xtable WHERE myint IN (3,29,88,99,100,77,52,21) GROUP BY myint HAVING count(myint) > 1 ORDER BY id DESC)
SELECT * FROM xtable, cte1 WHERE maxid - 1 = xtable.id ORDER BY xtable.id DESC;
;
- Обратите внимание, это основано на последовательной нумерации первичного ключа.