Funcția Window (SQL) - Window function (SQL)

În SQL , o funcție de fereastră sau funcție analitică este o funcție care folosește valori de pe unul sau mai multe rânduri pentru a returna o valoare pentru fiecare rând. (Aceasta contrastează cu o funcție agregată , care returnează o singură valoare pentru mai multe rânduri.) Funcțiile ferestrei au o clauză OVER; orice funcție fără clauză OVER nu este o funcție de fereastră, ci mai degrabă o funcție agregată sau cu un singur rând (scalar).

De exemplu, iată o interogare care folosește o funcție de fereastră pentru a compara fiecare angajat cu salariul mediu al departamentului său (exemplu din documentația PostgreSQL ):

SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;

Ieșire:

 depname  | empno | salary |          avg          
----------+-------+--------+----------------------
develop   |    11 |   5200 | 5020.0000000000000000
develop   |     7 |   4200 | 5020.0000000000000000
develop   |     9 |   4500 | 5020.0000000000000000
develop   |     8 |   6000 | 5020.0000000000000000
develop   |    10 |   5200 | 5020.0000000000000000
personnel |     5 |   3500 | 3700.0000000000000000
personnel |     2 |   3900 | 3700.0000000000000000
sales     |     3 |   4800 | 4866.6666666666666667
sales     |     1 |   5000 | 4866.6666666666666667
sales     |     4 |   4800 | 4866.6666666666666667
(10 rows)

Cele PARTITION BY grupează clauză rânduri în partiții și funcția se aplică pentru fiecare partiție separat. Dacă PARTITION BY clauza este omisă (cum ar fi dacă avem o OVER() clauză goală ), atunci întregul set de rezultate tratat ca o singură partiție. Pentru această interogare, salariul mediu raportat ar fi media preluată pe toate rândurile.

Funcțiile ferestrei sunt evaluate după agregare (de exemplu, după GROUP BY clauză și funcțiile agregate care nu sunt ferestre).

Sintaxă

Conform documentației PostgreSQL, o funcție de fereastră are sintaxa uneia dintre următoarele:

function_name ([expression [, expression ... ]]) OVER window_name
function_name ([expression [, expression ... ]]) OVER ( window_definition )
function_name ( * ) OVER window_name
function_name ( * ) OVER ( window_definition )

unde window_definition are sintaxă:

[ existing_window_name ]
[ PARTITION BY expression [, ...] ]
[ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ]
[ frame_clause ]

frame_clause are sintaxa uneia dintre următoarele:

{ RANGE | ROWS | GROUPS } frame_start [ frame_exclusion ]
{ RANGE | ROWS | GROUPS } BETWEEN frame_start AND frame_end [ frame_exclusion ]

frame_start și frame_end poate fi UNBOUNDED PRECEDING , offset PRECEDING , CURRENT ROW , offset FOLLOWING sau UNBOUNDED FOLLOWING . frame_exclusion poate fi EXCLUDE CURRENT ROW , EXCLUDE GROUP , EXCLUDE TIES sau EXCLUDE NO OTHERS .

expression se referă la orice expresie care nu conține un apel către o funcție de fereastră.

Notaţie:

  • Parantezele [] indică clauze opționale
  • Acoladurile {} indică un set de diferite opțiuni posibile, cu fiecare opțiune delimitată de o bară verticală |

Exemplu

Funcțiile de fereastră permit accesul la datele din înregistrări chiar înainte și după înregistrarea curentă. O funcție de fereastră definește un cadru sau o fereastră de rânduri cu o lungime dată în jurul rândului curent și efectuează un calcul pe ansamblul de date din fereastră.

      NAME |
------------
      Aaron| <-- Preceding (unbounded)
     Andrew|
     Amelia|
      James|
       Jill|
     Johnny| <-- 1st preceding row
    Michael| <-- Current row
       Nick| <-- 1st following row
    Ophelia|
       Zach| <-- Following (unbounded)

În tabelul de mai sus, următoarea interogare extrage pentru fiecare rând valorile unei ferestre cu un rând precedent și unul următor:

 SELECT
  LAG(name, 1) 
    OVER(ORDER BY name) "prev",
  name, 
  LEAD(name, 1) 
    OVER(ORDER BY name) "next"
 FROM people
 ORDER BY name

Interogarea rezultatului conține următoarele valori:

|     PREV |     NAME |     NEXT |
|----------|----------|----------|
|    (null)|     Aaron|    Andrew|
|     Aaron|    Andrew|    Amelia|
|    Andrew|    Amelia|     James|
|    Amelia|     James|      Jill|
|     James|      Jill|    Johnny|
|      Jill|    Johnny|   Michael|
|    Johnny|   Michael|      Nick|
|   Michael|      Nick|   Ophelia|
|      Nick|   Ophelia|      Zach|
|   Ophelia|      Zach|    (null)|

Istorie

Funcțiile Window au fost introduse în SQL: 2003 și funcționalitatea a fost extinsă în specificațiile ulterioare.

Vezi si

Referințe