Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Typer af Vinduesfunktioner | Nogle Yderligere Emner
SQL-optimering og Forespørgselsfunktioner

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 i n 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():

12345678
SELECT 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:

1234567891011
SELECT 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;
Forespørgselsbeskrivelse
expand arrow

Hoveddele af forespørgslen:

  • SELECT-klausul: Angiver de kolonner, der skal hentes fra tabellen.
    • Kolonnenavne: Indeholder kolonner som SalesID, ProductID, SalesDate og Amount for 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.

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:

123456789
SELECT 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.

question mark

Hvad gør funktionen NTILE() i SQL?

Vælg det korrekte svar

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 3

Spørg AI

expand

Spørg AI

ChatGPT

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 i n 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():

12345678
SELECT 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:

1234567891011
SELECT 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;
Forespørgselsbeskrivelse
expand arrow

Hoveddele af forespørgslen:

  • SELECT-klausul: Angiver de kolonner, der skal hentes fra tabellen.
    • Kolonnenavne: Indeholder kolonner som SalesID, ProductID, SalesDate og Amount for 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.

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:

123456789
SELECT 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.

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 3
some-alt