Typer av Fönsterfunktioner
Låt oss kortfattat utforska de huvudsakliga typerna av fönsterfunktioner som används i SQL.
Aggergeringsfunktioner
Detta är de vanliga aggregeringsfunktionerna (AVG
, SUM
, MAX
, MIN
, COUNT
) som används i ett fönstersammanhang. Vi har redan använt denna typ av fönsterfunktion i föregående kapitel.
Rankningsfunktioner
Rankningsfunktioner i SQL är en typ av fönsterfunktion som gör det möjligt att tilldela en rang till varje rad inom en partition av en resultatmängd. Dessa funktioner kan vara mycket användbara för att utföra ordnade beräkningar och analyser.
-
RANK()
: Tilldelar en unik rang till varje distinkt rad inom partitionen baserat påORDER BY
-satsen. Rader med lika värden får samma rang, med luckor i rankningen; -
DENSE_RANK()
: Liknar RANK(), men utan luckor i rankningssekvensen; -
NTILE(n)
: Delar upp raderna i en ordnad partition in
grupper och tilldelar ett gruppnummer till varje rad.
Exempel
Vi kommer att rangordna försäljningen baserat på Amount
för varje ProductID
i stigande ordning genom att använda 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 innehåller all information från huvudtabellen samt en extra kolumn som visar rangordningen för varje försäljning för den specifika produkten.
Värdejämförelsefunktioner
Värdejämförelsefönsterfunktioner i SQL används för att jämföra värden i den aktuella raden med värden i andra rader inom samma partition.
Dessa funktioner är särskilt användbara för uppgifter som innebär att analysera trender, utföra beräkningar baserat på angränsande rader eller hämta specifika radvärden inom ett definierat fönster.
Det finns flera värdejämförelsefunktioner i SQL:
LAG()
: Hämtar värdet från en föregående rad i resultatmängden utan behov av en självkoppling;LEAD()
: Hämtar värdet från en efterföljande rad i resultatmängden utan behov av en självkoppling;FIRST_VALUE()
: Returnerar värdet från den första raden i fönsterramen;LAST_VALUE()
: Returnerar värdet från den sista raden i fönsterramen.
Exempel
Vi använder värdejämförelsefönsterfunktionen LAG()
för att beräkna förändringen i försäljningsbelopp från föregående försäljning för varje 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 resultat kan vi enkelt ta fram information om försäljningsskillnader för varje specifik produkt utan att använda subfrågor eller lagrade procedurer.
Vi kan även beräkna skillnader för samtliga försäljningar utan partitionering med följande fråga:
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 att vi inte inkluderade PARTITION BY
-satsen i OVER
-blocket. Det betyder att vi inte vill hämta föregående värden endast för en viss produkt, utan för alla försäljningar i tabellen.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 4.35
Typer av Fönsterfunktioner
Svep för att visa menyn
Låt oss kortfattat utforska de huvudsakliga typerna av fönsterfunktioner som används i SQL.
Aggergeringsfunktioner
Detta är de vanliga aggregeringsfunktionerna (AVG
, SUM
, MAX
, MIN
, COUNT
) som används i ett fönstersammanhang. Vi har redan använt denna typ av fönsterfunktion i föregående kapitel.
Rankningsfunktioner
Rankningsfunktioner i SQL är en typ av fönsterfunktion som gör det möjligt att tilldela en rang till varje rad inom en partition av en resultatmängd. Dessa funktioner kan vara mycket användbara för att utföra ordnade beräkningar och analyser.
-
RANK()
: Tilldelar en unik rang till varje distinkt rad inom partitionen baserat påORDER BY
-satsen. Rader med lika värden får samma rang, med luckor i rankningen; -
DENSE_RANK()
: Liknar RANK(), men utan luckor i rankningssekvensen; -
NTILE(n)
: Delar upp raderna i en ordnad partition in
grupper och tilldelar ett gruppnummer till varje rad.
Exempel
Vi kommer att rangordna försäljningen baserat på Amount
för varje ProductID
i stigande ordning genom att använda 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 innehåller all information från huvudtabellen samt en extra kolumn som visar rangordningen för varje försäljning för den specifika produkten.
Värdejämförelsefunktioner
Värdejämförelsefönsterfunktioner i SQL används för att jämföra värden i den aktuella raden med värden i andra rader inom samma partition.
Dessa funktioner är särskilt användbara för uppgifter som innebär att analysera trender, utföra beräkningar baserat på angränsande rader eller hämta specifika radvärden inom ett definierat fönster.
Det finns flera värdejämförelsefunktioner i SQL:
LAG()
: Hämtar värdet från en föregående rad i resultatmängden utan behov av en självkoppling;LEAD()
: Hämtar värdet från en efterföljande rad i resultatmängden utan behov av en självkoppling;FIRST_VALUE()
: Returnerar värdet från den första raden i fönsterramen;LAST_VALUE()
: Returnerar värdet från den sista raden i fönsterramen.
Exempel
Vi använder värdejämförelsefönsterfunktionen LAG()
för att beräkna förändringen i försäljningsbelopp från föregående försäljning för varje 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 resultat kan vi enkelt ta fram information om försäljningsskillnader för varje specifik produkt utan att använda subfrågor eller lagrade procedurer.
Vi kan även beräkna skillnader för samtliga försäljningar utan partitionering med följande fråga:
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 att vi inte inkluderade PARTITION BY
-satsen i OVER
-blocket. Det betyder att vi inte vill hämta föregående värden endast för en viss produkt, utan för alla försäljningar i tabellen.
Tack för dina kommentarer!