SQLITE получает следующую строку после ORDERBY

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