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 resultatsæt. Disse funktioner er særdeles nyttige til at udføre ordnede beregninger og analyser.
-
RANK(): tildeler en unik rang til hver distinkte 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): opdeler rækkerne i en ordnet partition ingrupper 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, beregninger baseret på tilstødende rækker eller adgang til specifikke rækkeværdier inden for et defineret vindue.
Der findes flere værdissammenligningsfunktioner i SQL:
LAG(): henter værdien fra en forrige række i resultatsættet uden behov for et self-join;LEAD(): henter værdien fra en efterfølgende række i resultatsættet 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 oplysninger om salgsforskelle for hvert enkelt produkt nemt udtrækkes uden brug af underforespørgsler eller lagrede procedurer.
Forskelle for alle salg kan også beregnes 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 salgene 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.55
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 resultatsæt. Disse funktioner er særdeles nyttige til at udføre ordnede beregninger og analyser.
-
RANK(): tildeler en unik rang til hver distinkte 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): opdeler rækkerne i en ordnet partition ingrupper 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, beregninger baseret på tilstødende rækker eller adgang til specifikke rækkeværdier inden for et defineret vindue.
Der findes flere værdissammenligningsfunktioner i SQL:
LAG(): henter værdien fra en forrige række i resultatsættet uden behov for et self-join;LEAD(): henter værdien fra en efterfølgende række i resultatsættet 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 oplysninger om salgsforskelle for hvert enkelt produkt nemt udtrækkes uden brug af underforespørgsler eller lagrede procedurer.
Forskelle for alle salg kan også beregnes 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 salgene i tabellen.
Tak for dine kommentarer!