Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Typer av Fönsterfunktioner | Några Ytterligare Ämnen
SQL-optimering och Frågefunktioner

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 i n grupper 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():

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;

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:

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;
Beskrivning av frågan
expand arrow

Huvudsakliga delar av frågan:

  • SELECT-sats: Anger vilka kolumner som ska hämtas från tabellen.
    • Kolumnnamn: Inkluderar kolumner som SalesID, ProductID, SalesDate och Amount fö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.

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:

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;

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.

question mark

Vad gör funktionen NTILE() i SQL?

Vänligen välj det korrekta svaret

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

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 i n grupper 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():

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;

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:

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;
Beskrivning av frågan
expand arrow

Huvudsakliga delar av frågan:

  • SELECT-sats: Anger vilka kolumner som ska hämtas från tabellen.
    • Kolumnnamn: Inkluderar kolumner som SalesID, ProductID, SalesDate och Amount fö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.

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:

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;

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.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 3
some-alt