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 ett resultatset. Dessa funktioner är 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 rangordningen; -
DENSE_RANK(): liknar RANK(), men utan luckor i rangordningssekvensen; -
NTILE(n): delar upp raderna i en ordnad partition ingrupper och tilldelar ett gruppnummer till varje rad.
Exempel
Vi rangordnar 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 och 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 resultatet utan behov av en självkoppling;LEAD(): hämtar värdet från en efterföljande rad i resultatet 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;
Huvudsakliga delar av frågan:
SELECT-sats: Anger vilka kolumner som ska hämtas från tabellen.- Kolumnnamn: Inkluderar kolumner som
SalesID,ProductID,SalesDateochAmountför att visa relevant data för varje försäljning. - Fönsterfunktion: Använder funktionen
LAG()för att hämta föregående radens värde för en specifik kolumn inom en partition. En ytterligare beräknad kolumn visar skillnaden mellan aktuellt och föregående värde.
- Kolumnnamn: Inkluderar kolumner som
Syntax för fönsterfunktion:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)column_name: Kolumnen från vilken det föregående värdet ska hämtas.offset: Antalet rader bakåt från aktuell rad för att hämta värdet (standard är 1).default_value: Värdet som returneras om offset hamnar utanför partitionens gränser (valfritt).PARTITION BY partition_column: Delar upp resultatet i partitioner där fönsterfunktionen tillämpas, vilket säkerställer att funktionen verkar inom varje partition separat.ORDER BY order_column: Anger ordningen på raderna inom varje partition, vilket säkerställer att fönsterfunktionen behandlar raderna i en meningsfull sekvens.
Som resultat kan vi enkelt ta fram information om försäljningsskillnader för varje enskild produkt utan att använda subfrågor eller lagrade procedurer.
Vi kan också 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
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 ett resultatset. Dessa funktioner är 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 rangordningen; -
DENSE_RANK(): liknar RANK(), men utan luckor i rangordningssekvensen; -
NTILE(n): delar upp raderna i en ordnad partition ingrupper och tilldelar ett gruppnummer till varje rad.
Exempel
Vi rangordnar 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 och 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 resultatet utan behov av en självkoppling;LEAD(): hämtar värdet från en efterföljande rad i resultatet 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;
Huvudsakliga delar av frågan:
SELECT-sats: Anger vilka kolumner som ska hämtas från tabellen.- Kolumnnamn: Inkluderar kolumner som
SalesID,ProductID,SalesDateochAmountför att visa relevant data för varje försäljning. - Fönsterfunktion: Använder funktionen
LAG()för att hämta föregående radens värde för en specifik kolumn inom en partition. En ytterligare beräknad kolumn visar skillnaden mellan aktuellt och föregående värde.
- Kolumnnamn: Inkluderar kolumner som
Syntax för fönsterfunktion:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)column_name: Kolumnen från vilken det föregående värdet ska hämtas.offset: Antalet rader bakåt från aktuell rad för att hämta värdet (standard är 1).default_value: Värdet som returneras om offset hamnar utanför partitionens gränser (valfritt).PARTITION BY partition_column: Delar upp resultatet i partitioner där fönsterfunktionen tillämpas, vilket säkerställer att funktionen verkar inom varje partition separat.ORDER BY order_column: Anger ordningen på raderna inom varje partition, vilket säkerställer att fönsterfunktionen behandlar raderna i en meningsfull sekvens.
Som resultat kan vi enkelt ta fram information om försäljningsskillnader för varje enskild produkt utan att använda subfrågor eller lagrade procedurer.
Vi kan också 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!