Я хочу знать, как получить результаты в запросе SQL, выполняя некоторое логическое сравнение со следующей или предыдущей строкой. Я использую PostgreSQL.
Пример
Предположим, у меня есть таблица в моей базе данных с двумя атрибутами (упорядоченная позиция и случайные числа), я хочу получить нечетные числа, которые находятся между четными числами. Как я могу это сделать?
Реальное использование
Я хочу найти слова, которые находятся между двумя другими словами, имеющими категорию ИМЯ (и слово не является именем). Заказ осуществляется по предложениям и позициям.
Edit Я хочу знать, является ли оконная функция PostgreSQL лучшим решением для такого рода проблем, чем выполнение запросов. Я о них слышал, но никогда не использовал.
Вы можете найти лучшее решение по этому адресу:
Запрос 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