Как получить предыдущую или следующую строку в данной строке в mysql, используя опережение или отставание?

Я читал о функциях опережения и отставания, но до сих пор не понимаю. Мой синтаксис sql выглядит следующим образом:

SELECT description, lag(description) over (ORDER BY transid ASC) 
  FROM transaction 
 WHERE transid = 20;

Он не возвращает нужные данные. У меня есть таблица, в которой transid является первичным ключом в int, и столбец под названием description. Я думаю, что синтаксис неверен, потому что я хочу вернуть всю строку (все данные столбца), и я думаю, что это просто возвращает один столбец предыдущей строки. Как я могу это сделать? Кто-нибудь?

Возвращает всю предыдущую/следующую строку.


person buencamino    schedule 08.08.2019    source источник
comment
Вы можете поделиться вводом и желаемым результатом?   -  person Ed Bangga    schedule 08.08.2019
comment
У меня есть таблица, первичный ключ — это переход, а другие столбцы — это, например, refpage, refline, description, accountcode, codetype. Я ввожу значение transid, равное 10, и хочу получить значения строки до 10, то есть 9, и все столбцы, которые есть в 9. Или для следующей строки я получу значения столбца 11. Как мне получить данные? Результатом являются все столбцы предыдущей строки или следующей строки. Вход 10.   -  person buencamino    schedule 08.08.2019
comment
Я использую mysql.   -  person buencamino    schedule 08.08.2019
comment
Возможный дубликат Как получить следующую/предыдущую запись в MySQL?   -  person Sebastian Brosch    schedule 08.08.2019
comment
Какую версию MySQL вы используете?   -  person Tim Biegeleisen    schedule 08.08.2019
comment
Возможно, предложение WHERE уже удалило нужные вам строки.   -  person Salman A    schedule 08.08.2019
comment
в меню моего приложения написано mysql 8.0..   -  person buencamino    schedule 09.08.2019


Ответы (2)


Для предыдущей строки вы можете просто сделать это:

SELECT *
FROM transaction
WHERE transid < 20 
ORDER BY transid DESC
LIMIT 1

Для следующей строки вы меняете условия:

SELECT *
FROM transaction
WHERE transid > 20 
ORDER BY transid ASC
LIMIT 1
person Salman A    schedule 08.08.2019

Одним из вариантов может быть использование подзапроса с LEAD для ограничения желаемой предыдущей записи:

WITH cte AS (
    SELECT *, LEAD(transid) OVER (ORDER BY transid) transid_lead
    FROM transaction
)

SELECT *
FROM cte
WHERE transid_lead = 20;
person Tim Biegeleisen    schedule 08.08.2019
comment
Запрос не возвращает никаких значений.. только имена столбцов.. возможно, что-то не так с mysql и функциями отставания/опережения.. - person buencamino; 08.08.2019
comment
Какое значение возвращает подзапрос? - person Tim Biegeleisen; 08.08.2019
comment
просто нулевое значение. - person buencamino; 08.08.2019
comment
Тогда нет предыдущего значения для transid = 20 или нет записи transid = 20 для начала. - person Tim Biegeleisen; 08.08.2019
comment
Хорошо, есть ли запись, в которой transid меньше 20? SELECT COUNT(*) FROM transaction WHERE transid < 20 - person Tim Biegeleisen; 08.08.2019
comment
значение равно 14 для счета - person buencamino; 08.08.2019
comment
Предложение WHERE удалит все строки, кроме одной, чтобы не было предыдущей или следующей строки. - person Salman A; 08.08.2019
comment
@SalmanA Спасибо за решение этой проблемы, +1 к вашему ответу. - person Tim Biegeleisen; 08.08.2019