SQLite: запрос следующей записи после сопоставления последовательных строк из критериев - PullRequest
0 голосов
/ 20 сентября 2018

Скажем, у меня есть таблица sql, которая имеет 2 столбца: первый столбец содержит «первичный ключ», а второй столбец содержит «целое число» от 0 до 100.

Вопрос 1a: Есть лиспособ поиска 3 или более последовательных строк, соответствующих заданному значению (например, 3, 29, 88)

Вопрос 1b: есть ли способ получить следующее значение (запись), которое следует после 3 или болеезаписи в последовательном порядке.

Вопрос 1с: если база данных содержит более 1 совпадения последовательного порядка, показать все следующие значения (записи) последовательного порядка в порядке убывания «первичного ключа»

У меня малобазовые знания операторов SQL, и я был бы признателен, если бы кто-нибудь указал мне верное направление или дал пример того, как этого добиться.


РЕДАКТИРОВАТЬ 20-9-2018

Спасибо, что нашли время ответить на мой вопрос.@MikeT: Ваш пример немного за пределами моего знания SQL, но, пройдя через вас и просматривая некоторые команды, я понимаю, что он делает (я думаю).Но это не совсем то, что я ищу, хотя мне немного сложно это проверить, поскольку значения создаются случайным образом при каждом запуске.

Так что, как @ D-Shih спросил здесь, это пример того, чего я пытаюсь достичь: Пример изображения

1 Ответ

0 голосов
/ 20 сентября 2018

Вопрос 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, может потребоваться или не потребоваться, но может подойти для последующих вопросов.

Результатом вышесказанного может быть: -

enter image description here

Вопрос 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, чтобы затем выбратьстрока со следующим первичным ключом.

Это, например, приведет к: -

enter image description here

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

enter image description here

Вопрос 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;
;
  • Обратите внимание, это основано на последовательной нумерации первичного ключа.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...