Как сравнить текущую строку со следующей и предыдущей строками в PostgreSQL?

Я хочу знать, как получить результаты в запросе SQL, выполняя некоторое логическое сравнение со следующей или предыдущей строкой. Я использую PostgreSQL.

Пример
Предположим, у меня есть таблица в моей базе данных с двумя атрибутами (упорядоченная позиция и случайные числа), я хочу получить нечетные числа, которые находятся между четными числами. Как я могу это сделать?

Реальное использование
Я хочу найти слова, которые находятся между двумя другими словами, имеющими категорию ИМЯ (и слово не является именем). Заказ осуществляется по предложениям и позициям.

Edit Я хочу знать, является ли оконная функция PostgreSQL лучшим решением для такого рода проблем, чем выполнение запросов. Я о них слышал, но никогда не использовал.

22
задан Renato Dinhani 2 November 2011 в 03:02
поделиться

1 ответ

Вы можете найти лучшее решение по этому адресу:

http://blog.sqlauthority.com/2013/09/25/sql-server-how-to-access-the- previous-row-and-next-row-value-in-select-Statement-part-4 /

Запрос 1 для SQL Server 2012 и более поздних версий:

SELECT
LAG(p.FirstName) OVER(ORDER BY p.BusinessEntityID) PreviousValue,
    p.FirstName,
    LEAD(p.FirstName) OVER(ORDER BY p.BusinessEntityID) NextValue
FROM Person.Person p
GO

Запрос 2 для SQL Server 2005+ и более поздних версий:

WITH CTE AS(
    SELECT rownum = ROW_NUMBER() OVER(ORDER BY p.BusinessEntityID),
    p.FirstName FROM Person.Person p
)
SELECT
prev.FirstName PreviousValue,
    CTE.FirstName,
    nex.FirstName NextValue
FROM CTE
LEFT JOIN CTE prev ON prev.rownum = CTE.rownum - 1
LEFT JOIN CTE nex ON nex.rownum = CTE.rownum + 1
GO
6
ответ дан 29 November 2019 в 04:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: