PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да използвате структура на пръстеновидни данни във функциите на прозореца

  • Използвайте 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 заявка с максимална и минимална дата плюс асоцииран идентификатор на ред


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Хибернация на картографиране между PostgreSQL enum и Java enum

  2. Изпълнете динамична кръстосана заявка

  3. Как да интерпретирате стойността на PosgreSQL txid_current().

  4. Как работи COPY и защо е толкова по-бързо от INSERT?

  5. TypeError:Обектът 'int' не поддържа индексиране