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
Avancerade Tekniker i SQL

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

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;
copy

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:

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;
copy

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:

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;
copy

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?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 4

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

Awesome!

Completion rate improved to 4.35

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

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;
copy

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:

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;
copy

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:

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;
copy

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?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 4
some-alt