- Използвайте
COALESCE
като @Justin предоставено. -
С
first_value()
/last_value()
нуждате се за да добавитеORDER BY
клауза към дефиницията на прозореца или поръчката е недефинирана . Просто сте извадили късмет в примера, защото редовете са подредени веднага след създаването на фиктивната таблица.
След като добавитеORDER BY
, рамката на прозореца по подразбиране завършва на текущия ред , и трябва да посочите специален случай наlast_value()
извикайте - или върнете реда на сортиране в рамката на прозореца, както е показано в първия ми пример. -
При повторно използване на дефиниция на прозорец няколко пъти, изрично
WINDOW
клаузата опростява много синтаксиса:
SELECT ring, part, ARRAY[
coalesce(
lag(part) OVER w
,first_value(part) OVER (PARTITION BY ring ORDER BY part DESC))
,part
,coalesce(
lead(part) OVER w
,first_value(part) OVER w)
] AS neighbours
FROM rp
WINDOW w AS (PARTITION BY ring ORDER BY part);
Още по-добре , използвайте повторно същата дефиниция на прозореца, така че Postgres може да изчисли всички стойности в едно сканиране. За да работи това, трябва да дефинираме персонализирана рамка на прозореца :
SELECT ring, part, ARRAY[
coalesce(
lag(part) OVER w
,last_value(part) OVER w)
,part
,coalesce(
lead(part) OVER w
,first_value(part) OVER w)
] AS neighbours
FROM rp
WINDOW w AS (PARTITION BY ring
ORDER BY part
RANGE BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING)
ORDER BY 1,2;
Можете дори да адаптирате дефиницията на рамката за всяко извикване на функция на прозорец:
SELECT ring, part, ARRAY[
coalesce(
lag(part) OVER w
,last_value(part) OVER (w RANGE BETWEEN CURRENT ROW
AND UNBOUNDED FOLLOWING))
,part
,coalesce(
lead(part) OVER w
,first_value(part) OVER w)
] AS neighbours
FROM rp
WINDOW w AS (PARTITION BY ring ORDER BY part)
ORDER BY 1,2;
Може да е по-бързо за пръстени с много части. Ще трябва да тествате.
SQL Fiddle демонстрирайки и трите с подобрен тестов случай. Помислете за планове за заявки.
Повече за дефинициите на рамката на прозореца:
- В ръководството.
- Прозоречна функция на PostgreSQL:разделяне чрез сравнение
- PostgreSQL заявка с максимална и минимална дата плюс асоцииран идентификатор на ред