#sqlite
#sqlite
Вопрос:
Мне нужно получить следующую строку из запроса ORDERBY
У меня есть 2 столбца, идентификатор (первичный ключ), возраст (с плавающей точкой) в таблице T, и мне нужно что-то вроде следующего
SELECT ID FROM T WHERE !> (inputted ID) 1 rowID/Next row <! ORDERBY Age (then primary key, but I suspect if the Age values are the same SQLite would default to order by primary key anyway) LIMIT 1
По сути, он будет выбирать следующую строку после введенного идентификатора в упорядоченной таблице, ее следующую строку / rowID 1, я не уверен, как получить.
Как было предложено, вот набор данных в качестве примера
https://dbfiddle.uk?rdbms=sqlite_3.27amp;fiddle=19685ac20cc42041a59d318a01a2010f
ID Age
1 12.2
2 36.8
3 22.5
4 41
5 16.7
Я пытаюсь получить следующую строку из упорядоченного (по возрасту) списка с указанием определенного идентификатора
ID Age
1 12.2
5 16.7
3 22.5
2 36.8
4 41
Что-то похожее на
SELECT ID FROM OrderedInfo WHERE ID = 5 ORDER BY Age ASC LIMIT 1 OFFSET 1;
Мой ожидаемый результат будет «3» из приведенного выше примера данных
Я расширил набор данных, включив в него повторяющиеся записи, поскольку я неявно не указывал, что в нем могут быть такие данные — поскольку такой ответ forpas работает для первого примера без повторяющихся записей — спасибо за вашу помощь https://dbfiddle.uk?rdbms=sqlite_3.27amp;fiddle=f13d7f5a44ba414784547d9bbdf4997e
Комментарии:
1. Опубликуйте образцы данных и ожидаемые результаты, лучше в скрипке: dbfiddle.uk/?rdbms=sqlite_3.27 чтобы уточнить, чего вы хотите.
2. Добавлен пример, как вы предложили — извините, ответ занял много времени
Ответ №1:
Используйте подзапрос для идентификатора, который вы хотите в предложении WHERE:
SELECT *
FROM OrderedInfo
WHERE Age > (SELECT Age FROM OrderedInfo WHERE ID = 5)
ORDER BY Age LIMIT 1;
Посмотрите демонстрацию.
Если в столбце есть повторяющиеся значения Age
, используйте CTE, который возвращает нужную строку, и присоедините ее к таблице, чтобы развернуть условия:
WITH cte AS (SELECT ID, Age FROM OrderedInfo WHERE ID = 5)
SELECT o.*
FROM OrderedInfo o INNER JOIN cte c
ON o.Age > c.Age OR (o.Age = c.Age AND o.ID > c.ID)
ORDER BY o.Age, o.ID LIMIT 1;
Посмотрите демонстрацию.
Комментарии:
1. Это выглядит многообещающе — мой единственный вопрос, который нужно задать в связи с этим, будет ли упорядоченные результаты всегда иметь одинаковый порядок — например, если есть несколько записей с одинаковым возрастом, будут ли они всегда упорядочиваться одинаково при каждом выполнении запроса? или мне нужно добавить другой ORDER BY в подзапрос, чтобы убедиться, что они всегда показывают одно и то же? Спасибо за ответ.
2. @SJones если порядок строк не определен однозначно выражениями, которые вы используете в предложении ORDER BY, нет гарантии, что вы всегда будете получать одни и те же результаты.
3. Потрясающе, спасибо, это именно то, что мне было нужно
4. Я экспериментировал с вашим ответом, к сожалению, я столкнулся с исходной проблемой, заключающейся в том, что я не могу выбрать следующую строку, если, например, у меня 2 или более одинаковых возраста. « ВЫБЕРИТЕ * ИЗ OrderedInfo, ГДЕ Возраст>= (ВЫБЕРИТЕ Возраст ИЗ OrderedInfo, ГДЕ ID = 6) И ID != 6 ПОРЯДОК ПО возрасту, ОГРАНИЧЕНИЕ ИДЕНТИФИКАТОРА 1; « Я расширил пример набора данных несколькими записями с одинаковым возрастом — поскольку возраст становится больше, чем текущий возраст, он пропустит любой, который имеет тот же возраст — использование >= тогда не заставит запрос работать
5. @SJones это то, что вы должны уточнить с помощью примеров данных и ожидаемых результатов. Ваши текущие данные образца подразумевают, что повторяющихся возрастов нет, и мой код решает только это требование.