Typer av Vindusfunksjoner
Sveip for å vise menyen
La oss kort utforske hovedtypene av vindusfunksjoner som brukes i SQL.
Agregatfunksjoner
Dette er de vanlige agregatfunksjonene (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 rangeringsrekkefølgen; -
DENSE_RANK(): lik RANK(), men uten hull i rangeringssekvensen; -
NTILE(n): deler radene i en ordnet partisjon inn ingrupper 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 gir 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 forrige 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() til å 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;
Hoveddeler av spørringen:
SELECT-setning: Angir kolonnene som skal hentes fra tabellen.- Kolonnenavn: Inkluderer kolonner som
SalesID,ProductID,SalesDateogAmountfor å vise relevant data for hvert salg. - Vindusfunksjon: Bruker
LAG()-funksjonen for å hente verdien fra forrige rad for en bestemt kolonne innenfor en partisjon. En ekstra beregnet kolonne viser forskjellen mellom nåværende og forrige verdi.
- Kolonnenavn: Inkluderer kolonner som
Syntaks for vindusfunksjon:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)column_name: Kolonnen hvor forrige verdi skal hentes fra.offset: Antall rader bak nåværende rad for å hente verdien (standard er 1).default_value: Verdien som returneres hvis offset går utenfor grensene til partisjonen (valgfritt).PARTITION BY partition_column: Deler resultatsettet inn i partisjoner som vindusfunksjonen brukes på, slik at funksjonen opererer separat innenfor hver partisjon.ORDER BY order_column: Angir rekkefølgen på radene innenfor hver partisjon, slik at vindusfunksjonen behandler radene i en meningsfull sekvens.
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. Det 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
Typer av Vindusfunksjoner
La oss kort utforske hovedtypene av vindusfunksjoner som brukes i SQL.
Agregatfunksjoner
Dette er de vanlige agregatfunksjonene (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 rangeringsrekkefølgen; -
DENSE_RANK(): lik RANK(), men uten hull i rangeringssekvensen; -
NTILE(n): deler radene i en ordnet partisjon inn ingrupper 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 gir 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 forrige 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() til å 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;
Hoveddeler av spørringen:
SELECT-setning: Angir kolonnene som skal hentes fra tabellen.- Kolonnenavn: Inkluderer kolonner som
SalesID,ProductID,SalesDateogAmountfor å vise relevant data for hvert salg. - Vindusfunksjon: Bruker
LAG()-funksjonen for å hente verdien fra forrige rad for en bestemt kolonne innenfor en partisjon. En ekstra beregnet kolonne viser forskjellen mellom nåværende og forrige verdi.
- Kolonnenavn: Inkluderer kolonner som
Syntaks for vindusfunksjon:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)column_name: Kolonnen hvor forrige verdi skal hentes fra.offset: Antall rader bak nåværende rad for å hente verdien (standard er 1).default_value: Verdien som returneres hvis offset går utenfor grensene til partisjonen (valgfritt).PARTITION BY partition_column: Deler resultatsettet inn i partisjoner som vindusfunksjonen brukes på, slik at funksjonen opererer separat innenfor hver partisjon.ORDER BY order_column: Angir rekkefølgen på radene innenfor hver partisjon, slik at vindusfunksjonen behandler radene i en meningsfull sekvens.
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. Det betyr at vi ikke ønsker å hente tidligere verdier kun for et bestemt produkt, men for alle salgene i tabellen.
Takk for tilbakemeldingene dine!