Typer 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 in
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()
:
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 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:
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 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:
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 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.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
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
Typer 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 in
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()
:
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 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:
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 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:
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 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.
Takk for tilbakemeldingene dine!