PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak używać struktury danych pierścienia w funkcjach okien

  • Użyj COALESCE jak podał @Justin.
  • Z first_value() / last_value() potrzebujesz aby dodać ORDER BY klauzula do definicji okna lub kolejność jest nieokreślona . Po prostu miałeś szczęście w tym przykładzie, ponieważ wiersze są w porządku zaraz po utworzeniu fikcyjnej tabeli.
    Po dodaniu ORDER BY , domyślna ramka okna kończy się w bieżącym wierszu , i musisz użyć specjalnej wielkości liter last_value() zadzwoń - lub przywróć porządek sortowania w ramce okna, jak pokazano w moim pierwszym przykładzie.

  • Podczas wielokrotnego używania definicji okna, jawne WINDOW klauzula znacznie upraszcza składnię:

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);

Jeszcze lepiej , ponownie użyj tej samej definicji okna, aby Postgres mógł obliczyć wszystkie wartości w jednym skanie. Aby to zadziałało, musimy zdefiniować niestandardową ramę okna :

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;

Możesz nawet dostosować definicję ramki dla każdego wywołania funkcji okna:

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;

Może być szybszy w przypadku pierścionków z wieloma częściami. Będziesz musiał przetestować.

Skrzypce SQL demonstrowanie wszystkich trzech z ulepszonym przypadkiem testowym. Rozważ plany zapytań.

Więcej o definicjach ram okiennych:

  • W instrukcji.
  • Funkcja okna PostgreSQL:partycja przez porównanie
  • Zapytanie PostgreSQL z maksymalną i minimalną datą oraz powiązanym identyfikatorem na wiersz


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Korzystanie z klauzuli EXCEPT w PostgreSQL

  2. Rejestrowanie audytów dla PostgreSQL

  3. Multi-DC PostgreSQL:konfigurowanie węzła gotowości w innej lokalizacji geograficznej za pośrednictwem sieci VPN

  4. Jak skonfigurować fragmentowanie PostgreSQL za pomocą ClusterControl

  5. Tabele i indeksy a HDD i SSD