Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Typer av Vindusfunksjoner | Noen Tilleggs­emner
Avanserte Teknikker i SQL

bookTyper av Vindusfunksjoner

La oss kort utforske hovedtypene av vindusfunksjoner som brukes i SQL.

Aggergeringsfunksjoner

Dette er de vanlige aggregeringsfunksjonene (AVG, SUM, MAX, MIN, COUNT) brukt i en vinduskontekst. Vi har allerede brukt denne typen vindusfunksjon i forrige kapittel.

Rangeringsfunksjoner

Rangeringsfunksjoner i SQL er en type vindusfunksjon som lar deg tildele en rangering til hver rad innenfor en partisjon av et resultatsett. Disse funksjonene kan være svært nyttige for å utføre ordnede beregninger og analyser.

  • RANK(): Tildeler en unik rangering til hver distinkte rad innenfor partisjonen basert på ORDER BY-klausulen. Rader med like verdier får samme rangering, med hull i rangeringssekvensen;

  • DENSE_RANK(): Ligner på RANK(), men uten hull i rangeringssekvensen;

  • NTILE(n): Deler radene i en ordnet partisjon inn i n grupper og tildeler et gruppenummer til hver rad.

Eksempel

Vi rangerer salgene basert på Amount for hver ProductID i stigende rekkefølge ved å bruke funksjonen 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;
copy

Resultattabellen inneholder all informasjon fra hovedtabellen og en ekstra kolonne som viser rangeringen av hvert salg for det aktuelle produktet.

Verdikomparisjonsfunksjoner

Verdikomparisjons-vindusfunksjoner i SQL brukes til å sammenligne verdier i den nåværende raden med verdier i andre rader innenfor samme partisjon.
Disse funksjonene er spesielt nyttige for oppgaver som innebærer å analysere trender, utføre beregninger basert på tilstøtende rader, eller få tilgang til spesifikke radverdier innenfor et definert vindu. Det finnes flere verdikomparisjonsfunksjoner i SQL:

  • LAG(): Henter verdien fra en tidligere rad i resultatsettet uten behov for en selv-join;
  • LEAD(): Henter verdien fra en påfølgende rad i resultatsettet uten behov for en selv-join;
  • FIRST_VALUE(): Returnerer verdien til den første raden i vindusrammen;
  • LAST_VALUE(): Returnerer verdien til den siste raden i vindusrammen.

Eksempel

Vi bruker verdikomparisjons-vindusfunksjonen LAG() for å beregne endringen i salgsbeløp fra 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;
copy

Som et resultat kan vi enkelt hente ut informasjon om salgsforskjeller for hvert enkelt produkt uten å bruke underforespørsler eller lagrede prosedyrer.
Vi kan også beregne forskjeller for alle salg uten partisjonering ved å bruke følgende spørring:

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;
copy

Du kan se at vi ikke inkluderte PARTITION BY-klausulen i OVER-blokken. Dette betyr at vi ikke ønsker å hente tidligere verdier kun for et bestemt produkt, men for alle salgene i tabellen.

question mark

Hva gjør funksjonen 'NTILE()' i SQL?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 4

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Awesome!

Completion rate improved to 4.35

bookTyper av Vindusfunksjoner

Sveip for å vise menyen

La oss kort utforske hovedtypene av vindusfunksjoner som brukes i SQL.

Aggergeringsfunksjoner

Dette er de vanlige aggregeringsfunksjonene (AVG, SUM, MAX, MIN, COUNT) brukt i en vinduskontekst. Vi har allerede brukt denne typen vindusfunksjon i forrige kapittel.

Rangeringsfunksjoner

Rangeringsfunksjoner i SQL er en type vindusfunksjon som lar deg tildele en rangering til hver rad innenfor en partisjon av et resultatsett. Disse funksjonene kan være svært nyttige for å utføre ordnede beregninger og analyser.

  • RANK(): Tildeler en unik rangering til hver distinkte rad innenfor partisjonen basert på ORDER BY-klausulen. Rader med like verdier får samme rangering, med hull i rangeringssekvensen;

  • DENSE_RANK(): Ligner på RANK(), men uten hull i rangeringssekvensen;

  • NTILE(n): Deler radene i en ordnet partisjon inn i n grupper og tildeler et gruppenummer til hver rad.

Eksempel

Vi rangerer salgene basert på Amount for hver ProductID i stigende rekkefølge ved å bruke funksjonen 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;
copy

Resultattabellen inneholder all informasjon fra hovedtabellen og en ekstra kolonne som viser rangeringen av hvert salg for det aktuelle produktet.

Verdikomparisjonsfunksjoner

Verdikomparisjons-vindusfunksjoner i SQL brukes til å sammenligne verdier i den nåværende raden med verdier i andre rader innenfor samme partisjon.
Disse funksjonene er spesielt nyttige for oppgaver som innebærer å analysere trender, utføre beregninger basert på tilstøtende rader, eller få tilgang til spesifikke radverdier innenfor et definert vindu. Det finnes flere verdikomparisjonsfunksjoner i SQL:

  • LAG(): Henter verdien fra en tidligere rad i resultatsettet uten behov for en selv-join;
  • LEAD(): Henter verdien fra en påfølgende rad i resultatsettet uten behov for en selv-join;
  • FIRST_VALUE(): Returnerer verdien til den første raden i vindusrammen;
  • LAST_VALUE(): Returnerer verdien til den siste raden i vindusrammen.

Eksempel

Vi bruker verdikomparisjons-vindusfunksjonen LAG() for å beregne endringen i salgsbeløp fra 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;
copy

Som et resultat kan vi enkelt hente ut informasjon om salgsforskjeller for hvert enkelt produkt uten å bruke underforespørsler eller lagrede prosedyrer.
Vi kan også beregne forskjeller for alle salg uten partisjonering ved å bruke følgende spørring:

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;
copy

Du kan se at vi ikke inkluderte PARTITION BY-klausulen i OVER-blokken. Dette betyr at vi ikke ønsker å hente tidligere verdier kun for et bestemt produkt, men for alle salgene i tabellen.

question mark

Hva gjør funksjonen 'NTILE()' i SQL?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 4
some-alt