Skip to content

SQL-vinduesfunktioner forklaret

Alle almindelige SQL-vinduesfunktioner og de klausuler, der styrer dem, grupperet efter opgave: rangordne rækker, kigge på naboerne, køre totaler hen over en ramme og hente den første eller sidste værdi. Hver række parrer funktionen med et eksempel på én linje.

En vinduesfunktion beregner et resultat på tværs af rækker, der er relateret til den aktuelle række, uden at kollapse dem, som GROUP BY gør. Enhver vinduesfunktion ender i en OVER-klausul, der definerer vinduet: PARTITION BY grupperer rækkerne, ORDER BY sætter dem i rækkefølge, og den valgfri ramme afgrænser det glidende sæt. Mestr OVER, og resten er ordforråd.

Referencetabel · 27 poster
27 of 27 rows
Rangordning
Et unikt fortløbende heltal pr. række i vinduet.ROW_NUMBER() OVER (ORDER BY total DESC)
Rang med huller; rækker med samme værdi deler rang, og de næste numre springes over.RANK() OVER (ORDER BY total DESC)
Rang uden huller; rækker med samme værdi deler rang, og intet springes over.DENSE_RANK() OVER (ORDER BY total DESC)
Deler det ordnede vindue i n nogenlunde lige store bunker.NTILE(4) OVER (ORDER BY total DESC)
Kig på naboerne
En værdi n rækker tilbage; standardværdien træder i stedet, når en sådan række ikke findes.LAG(total, 1, 0) OVER (ORDER BY created_at)
En værdi n rækker frem; standardværdien træder i stedet, når en sådan række ikke findes.LEAD(total, 1, 0) OVER (ORDER BY created_at)
Aggregation over et vindue
En løbende eller partitioneret total uden at kollapse rækker.SUM(total) OVER (ORDER BY created_at)
Et løbende eller partitioneret gennemsnit.AVG(total) OVER (PARTITION BY user_id)
Et løbende eller partitioneret antal rækker.COUNT(*) OVER (PARTITION BY user_id)
Den laveste værdi i vinduet eller partitionen.MIN(total) OVER (PARTITION BY user_id)
Den højeste værdi i vinduet eller partitionen.MAX(total) OVER (PARTITION BY user_id)
SUM med ORDER BY og en ramme, der er åben fra starten; hver række summerer alt frem til sig selv.SUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
AVG over en ramme på n rækker før og efter den aktuelle række.AVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Første, sidste og percentiler
Den første værdi i vinduets rækkefølge.FIRST_VALUE(total) OVER (ORDER BY total DESC)
Den sidste værdi i rammen; uden UNBOUNDED FOLLOWING stopper rammen ved den aktuelle række.LAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
Værdien på den n'te række i vinduets rækkefølge.NTH_VALUE(total, 2) OVER (ORDER BY total DESC)
Rækkens relative rang, fra 0 til 1.PERCENT_RANK() OVER (ORDER BY total)
Andelen af rækker på eller før den aktuelle række, fra 1/n op til 1.CUME_DIST() OVER (ORDER BY total)
OVER-klausulen
Definerer vinduet, som enhver funktion læser.<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
Starter vinduet forfra for hver gruppe af rækker.PARTITION BY user_id
Sætter rækkerne i rækkefølge inden for hver partition.ORDER BY created_at
Afgrænser den glidende ramme, f.eks. fra foregående til efterfølgende rækker.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
Afgrænser rammen efter værdier, ikke rækkepositioner; CURRENT ROW omfatter rækker med samme værdi, og dette er standardrammen under ORDER BY.RANGE BETWEEN 100 PRECEDING AND CURRENT ROW
Afgrænser rammen efter grupper af rækker med samme værdi fra ORDER BY.GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
Fjerner den aktuelle række fra rammen; EXCLUDE TIES fjerner i stedet rækkerne med samme værdi.ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
Navngiver et vindue én gang pr. forespørgsel, så flere OVER-klausuler kan genbruge det.WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
Indsnævrer de rækker, en vinduesaggregat læser, før vinduet anvendes.SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)