Alle vanlige SQL-vindusfunksjoner og klausulene som styrer dem, gruppert etter jobb: ranger rader, se på naboer, kjør totaler over en ramme og hent første eller siste verdi. Hver rad kobler funksjonen til et eksempel på én linje.
En vindusfunksjon beregner et resultat over rader som er knyttet til den aktuelle raden, uten å slå dem sammen slik GROUP BY gjør. Hver vindusfunksjon avsluttes med en OVER-klausul som definerer vinduet: PARTITION BY grupperer rader, ORDER BY sekvensierer dem, og den valgfrie rammen begrenser det glidende utvalget. Mestr OVER, og resten er ordforråd.
Referansetabell · 27 oppføringer
SQL-vindusfunksjonerExplained
27 of 27 rows
Rangering
Et unikt fortløpende heltall per rad innenfor vinduet.
ROW_NUMBER() OVER (ORDER BY total DESC)
Rang med hull; delte verdier får samme rang og hopper over de neste tallene.
RANK() OVER (ORDER BY total DESC)
Rang uten hull; delte verdier får samme rang og ingenting hoppes over.
DENSE_RANK() OVER (ORDER BY total DESC)
Deler det ordnede vinduet i n omtrent like store grupper.
NTILE(4) OVER (ORDER BY total DESC)
Se på naboer
En verdi fra n rader tilbake; standardverdien treffer inn når ingen slik rad finnes.
LAG(total, 1, 0) OVER (ORDER BY created_at)
En verdi fra n rader frem; standardverdien treffer inn når ingen slik rad finnes.
LEAD(total, 1, 0) OVER (ORDER BY created_at)
Aggregere over et vindu
En løpende eller partisjonert sum uten å slå sammen rader.
SUM(total) OVER (ORDER BY created_at)
Et løpende eller partisjonert gjennomsnitt.
AVG(total) OVER (PARTITION BY user_id)
Et løpende eller partisjonert radantall.
COUNT(*) OVER (PARTITION BY user_id)
Den laveste verdien i vinduet eller partisjonen.
MIN(total) OVER (PARTITION BY user_id)
Den høyeste verdien i vinduet eller partisjonen.
MAX(total) OVER (PARTITION BY user_id)
SUM med ORDER BY og en ramme åpen i starten; hver rad summerer alt frem til seg selv.
SUM(total) OVER (ORDER BY created_at ROWS UNBOUNDED PRECEDING)
AVG over en ramme med n rader før og etter den aktuelle raden.
AVG(total) OVER (ORDER BY created_at ROWS BETWEEN 2 PRECEDING AND 2 FOLLOWING)
Første, siste og percentiler
Den første verdien i vinduets rekkefølge.
FIRST_VALUE(total) OVER (ORDER BY total DESC)
Den siste verdien i rammen; uten UNBOUNDED FOLLOWING stopper rammen ved den aktuelle raden.
LAST_VALUE(total) OVER (ORDER BY total ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
Verdien på den n-te raden i vinduets rekkefølge.
NTH_VALUE(total, 2) OVER (ORDER BY total DESC)
Den relative rangen til en rad, fra 0 til 1.
PERCENT_RANK() OVER (ORDER BY total)
Andelen rader på eller før den aktuelle raden, fra 1/n opp til 1.
CUME_DIST() OVER (ORDER BY total)
OVER-klausulen
Definerer vinduet enhver funksjon leser.
<fn>() OVER (PARTITION BY user_id ORDER BY created_at)
Starter vinduet på nytt for hver gruppe med rader.
PARTITION BY user_id
Setter rader i rekkefølge inne i hver partisjon.
ORDER BY created_at
Begrenser den glidende rammen, f.eks. fra foregående til etterfølgende rader.
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
Begrenser rammen etter verdier, ikke radposisjoner; CURRENT ROW tar med rader med like verdier, og dette er standardrammen under ORDER BY.
RANGE BETWEEN 100 PRECEDING AND CURRENT ROW
Begrenser rammen etter grupper av rader med like verdier fra ORDER BY.
GROUPS BETWEEN 1 PRECEDING AND CURRENT ROW
Fjerner den aktuelle raden fra rammen; EXCLUDE TIES fjerner i stedet radene med like verdier.
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING EXCLUDE CURRENT ROW
Gir vinduet et navn én gang per spørring, slik at flere OVER-klausuler kan gjenbruke det.
WINDOW w AS (PARTITION BY user_id ORDER BY created_at)
Avgrenser radene et vindusaggregat leser, før vinduet blir brukt.
SUM(total) FILTER (WHERE status = 'paid') OVER (ORDER BY created_at)