Typer af Vinduesfunktioner
Stryg for at vise menuen
Lad os kort udforske de vigtigste typer af vinduesfunktioner, der bruges i SQL.
Aggergeringsfunktioner
Dette er de standard aggregeringsfunktioner (AVG, SUM, MAX, MIN, COUNT), der anvendes i en vindueskontekst. Vi har allerede brugt 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 meget 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 rangeringen; -
DENSE_RANK(): ligner RANK(), men uden huller i rangeringssekvensen; -
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 resultatet uden behov for et self-join;LEAD(): henter værdien fra en efterfølgende række i resultatet 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;
Hoveddele af forespørgslen:
SELECT-klausul: Angiver de kolonner, der skal hentes fra tabellen.- Kolonnenavne: Indeholder kolonner som
SalesID,ProductID,SalesDateogAmountfor at vise relevante data for hvert salg. - Vinduesfunktion: Anvender funktionen
LAG()til at hente den foregående rækkes værdi for en bestemt kolonne inden for en partition. En yderligere beregnet kolonne viser forskellen mellem den aktuelle og den foregående værdi.
- Kolonnenavne: Indeholder kolonner som
Syntaks for vinduesfunktion:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)column_name: Kolonnen, hvorfra den foregående værdi skal hentes.offset: Antallet af rækker tilbage fra den aktuelle række, hvorfra værdien skal hentes (standard er 1).default_value: Den værdi, der returneres, hvis offset går uden for partitionens grænser (valgfrit).PARTITION BY partition_column: Opdeler resultatmængden i partitioner, som vinduesfunktionen anvendes på, så funktionen arbejder separat inden for hver partition.ORDER BY order_column: Angiver rækkefølgen af rækkerne inden for hver partition, så vinduesfunktionen behandler rækkerne i en meningsfuld sekvens.
Som resultat kan vi nemt udtrække information om salgsforskelle for hvert enkelt produkt uden brug af underforespørgsler eller lagrede procedurer.
Vi kan også beregne forskelle for alle salg uden partitionering ved at bruge 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
Typer af Vinduesfunktioner
Lad os kort udforske de vigtigste typer af vinduesfunktioner, der bruges i SQL.
Aggergeringsfunktioner
Dette er de standard aggregeringsfunktioner (AVG, SUM, MAX, MIN, COUNT), der anvendes i en vindueskontekst. Vi har allerede brugt 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 meget 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 rangeringen; -
DENSE_RANK(): ligner RANK(), men uden huller i rangeringssekvensen; -
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 resultatet uden behov for et self-join;LEAD(): henter værdien fra en efterfølgende række i resultatet 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;
Hoveddele af forespørgslen:
SELECT-klausul: Angiver de kolonner, der skal hentes fra tabellen.- Kolonnenavne: Indeholder kolonner som
SalesID,ProductID,SalesDateogAmountfor at vise relevante data for hvert salg. - Vinduesfunktion: Anvender funktionen
LAG()til at hente den foregående rækkes værdi for en bestemt kolonne inden for en partition. En yderligere beregnet kolonne viser forskellen mellem den aktuelle og den foregående værdi.
- Kolonnenavne: Indeholder kolonner som
Syntaks for vinduesfunktion:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)column_name: Kolonnen, hvorfra den foregående værdi skal hentes.offset: Antallet af rækker tilbage fra den aktuelle række, hvorfra værdien skal hentes (standard er 1).default_value: Den værdi, der returneres, hvis offset går uden for partitionens grænser (valgfrit).PARTITION BY partition_column: Opdeler resultatmængden i partitioner, som vinduesfunktionen anvendes på, så funktionen arbejder separat inden for hver partition.ORDER BY order_column: Angiver rækkefølgen af rækkerne inden for hver partition, så vinduesfunktionen behandler rækkerne i en meningsfuld sekvens.
Som resultat kan vi nemt udtrække information om salgsforskelle for hvert enkelt produkt uden brug af underforespørgsler eller lagrede procedurer.
Vi kan også beregne forskelle for alle salg uden partitionering ved at bruge 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!