Typer af Vinduesfunktioner
Lad os kort gennemgå de vigtigste typer af vinduesfunktioner, der anvendes i SQL.
Aggergeringsfunktioner
Dette er de standard aggregeringsfunktioner (AVG
, SUM
, MAX
, MIN
, COUNT
), der bruges i en vindueskontekst. Vi har allerede anvendt denne type vinduesfunktion i det forrige kapitel.
Rangeringsfunktioner
Rangeringsfunktioner i SQL er en type vinduesfunktion, der gør det muligt at tildele en rang til hver række inden for en partition af et resultat. Disse funktioner kan være yderst nyttige til at udføre ordnede beregninger og analyser.
-
RANK()
: Tildeler en unik rang til hver distinkt række inden for partitionen baseret påORDER BY
-klausulen. Rækker med samme værdi får samme rang, og der efterlades huller i rangfølgen; -
DENSE_RANK()
: Ligner RANK(), men uden huller i rangfølgen; -
NTILE(n)
: Deler rækkerne i en ordnet partition op in
grupper og tildeler et gruppenummer til hver række.
Eksempel
Vi rangerer salgene baseret på Amount
for hver ProductID
i stigende rækkefølge ved at bruge funktionen DENSE_RANK()
:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
Resultattabellen indeholder alle oplysninger fra hovedtabellen samt en ekstra kolonne, der angiver rangeringen af hvert salg for det pågældende produkt.
Værdisammenligningsfunktioner
Værdissammenlignende vinduesfunktioner i SQL bruges til at sammenligne værdier i den aktuelle række med værdier i andre rækker inden for samme partition.
Disse funktioner er særligt nyttige til opgaver, der involverer analyse af tendenser, udførelse af beregninger baseret på tilstødende rækker eller adgang til specifikke rækkeværdier inden for et defineret vindue.
Der findes flere værdissammenlignende funktioner i SQL:
LAG()
: Henter værdien fra en forrige række i resultatmængden uden behov for et self-join;LEAD()
: Henter værdien fra en efterfølgende række i resultatmængden uden behov for et self-join;FIRST_VALUE()
: Returnerer værdien af den første række i vinduesrammen;LAST_VALUE()
: Returnerer værdien af den sidste række i vinduesrammen.
Eksempel
Vi bruger værdissammenligningsfunktionen LAG()
til at beregne ændringen i salgsbeløb fra det forrige salg for hvert produkt:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Som resultat kan vi nemt udtrække oplysninger om salgsforskelle for hvert enkelt produkt uden at bruge underforespørgsler eller lagrede procedurer.
Vi kan også beregne forskelle for alle salg uden partitionering ved hjælp af følgende forespørgsel:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Du kan se, at vi ikke inkluderede PARTITION BY
-klausulen i OVER
-blokken. Det betyder, at vi ikke ønsker at hente tidligere værdier kun for et bestemt produkt, men for alle salg i tabellen.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Awesome!
Completion rate improved to 4.35
Typer af Vinduesfunktioner
Stryg for at vise menuen
Lad os kort gennemgå de vigtigste typer af vinduesfunktioner, der anvendes i SQL.
Aggergeringsfunktioner
Dette er de standard aggregeringsfunktioner (AVG
, SUM
, MAX
, MIN
, COUNT
), der bruges i en vindueskontekst. Vi har allerede anvendt denne type vinduesfunktion i det forrige kapitel.
Rangeringsfunktioner
Rangeringsfunktioner i SQL er en type vinduesfunktion, der gør det muligt at tildele en rang til hver række inden for en partition af et resultat. Disse funktioner kan være yderst nyttige til at udføre ordnede beregninger og analyser.
-
RANK()
: Tildeler en unik rang til hver distinkt række inden for partitionen baseret påORDER BY
-klausulen. Rækker med samme værdi får samme rang, og der efterlades huller i rangfølgen; -
DENSE_RANK()
: Ligner RANK(), men uden huller i rangfølgen; -
NTILE(n)
: Deler rækkerne i en ordnet partition op in
grupper og tildeler et gruppenummer til hver række.
Eksempel
Vi rangerer salgene baseret på Amount
for hver ProductID
i stigende rækkefølge ved at bruge funktionen DENSE_RANK()
:
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
Resultattabellen indeholder alle oplysninger fra hovedtabellen samt en ekstra kolonne, der angiver rangeringen af hvert salg for det pågældende produkt.
Værdisammenligningsfunktioner
Værdissammenlignende vinduesfunktioner i SQL bruges til at sammenligne værdier i den aktuelle række med værdier i andre rækker inden for samme partition.
Disse funktioner er særligt nyttige til opgaver, der involverer analyse af tendenser, udførelse af beregninger baseret på tilstødende rækker eller adgang til specifikke rækkeværdier inden for et defineret vindue.
Der findes flere værdissammenlignende funktioner i SQL:
LAG()
: Henter værdien fra en forrige række i resultatmængden uden behov for et self-join;LEAD()
: Henter værdien fra en efterfølgende række i resultatmængden uden behov for et self-join;FIRST_VALUE()
: Returnerer værdien af den første række i vinduesrammen;LAST_VALUE()
: Returnerer værdien af den sidste række i vinduesrammen.
Eksempel
Vi bruger værdissammenligningsfunktionen LAG()
til at beregne ændringen i salgsbeløb fra det forrige salg for hvert produkt:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Som resultat kan vi nemt udtrække oplysninger om salgsforskelle for hvert enkelt produkt uden at bruge underforespørgsler eller lagrede procedurer.
Vi kan også beregne forskelle for alle salg uden partitionering ved hjælp af følgende forespørgsel:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Du kan se, at vi ikke inkluderede PARTITION BY
-klausulen i OVER
-blokken. Det betyder, at vi ikke ønsker at hente tidligere værdier kun for et bestemt produkt, men for alle salg i tabellen.
Tak for dine kommentarer!