Fönsterfunktioner är en kraftfull funktion i SQL som används för att utföra beräkningar över en uppsättning rader relaterade till den aktuella raden. Till skillnad från aggregerade funktioner, grupperar inte fönsterfunktioner rader i en enda utdata; de returnerar ett resultat för varje rad samtidigt som datauppsättningens kontext bibehålls.
I den här artikeln kommer vi att utforska några vanliga SQL-fönsterfunktioner ( ROW_NUMBER()
, RANK()
, DENSE_RANK()
, NTILE()
, LEAD()
och LAG()
) med exempel.
Vi använder följande försäljningstabell för att demonstrera fönsterfunktioner:
Försäljnings-ID | Kund-ID | Produkt | Område | Belopp | Försäljningsdatum |
---|---|---|---|---|---|
1 | 101 | Laptop | Norr | 1200 | 2023-01-05 |
2 | 102 | Tablett | Norr | 800 | 2023-02-15 |
3 | 103 | Telefon | Norr | 800 | 2023-03-10 |
4 | 104 | Tablett | Norr | 500 | 2023-04-01 |
5 | 105 | Laptop | Söder | 1300 | 2023-05-05 |
6 | 106 | Tablett | Söder | 700 | 2023-06-20 |
7 | 107 | Telefon | Väst | 900 | 2023-07-15 |
8 | 108 | Laptop | Öst | 1300 | 2023-08-10 |
Funktionen ROW_NUMBER() tilldelar ett unikt nummer till varje rad inom en partition, sorterad efter en angiven kolumn.
Uppgift : Tilldela ett unikt radnummer till varje försäljning inom en region baserat på försäljningsbeloppet (högst till lägst).
SELECT SalesID, Region, Amount, ROW_NUMBER() OVER (PARTITION BY Region ORDER BY Amount DESC) AS RowNum FROM Sales;
Resultat :
Försäljnings-ID | Område | Belopp | RadNum |
---|---|---|---|
1 | Norr | 1200 | 1 |
2 | Norr | 800 | 2 |
3 | Norr | 800 | 3 |
4 | Norr | 500 | 4 |
5 | Söder | 1300 | 1 |
6 | Söder | 700 | 2 |
7 | Väst | 900 | 1 |
8 | Öst | 1300 | 1 |
Funktionen RANK() tilldelar en rangordning till varje rad inom en partition. Rader med samma värden får samma rankning och nästa rankning hoppas över.
Uppgift : Rangordna försäljningen inom varje region efter belopp (högst till lägst).
SELECT SalesID, Region, Amount, RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS Rank FROM Sales;
Resultat :
Försäljnings-ID | Område | Belopp | Rang |
---|---|---|---|
1 | Norr | 1200 | 1 |
2 | Norr | 800 | 2 |
3 | Norr | 800 | 2 |
4 | Norr | 500 | 4 |
5 | Söder | 1300 | 1 |
6 | Söder | 700 | 2 |
7 | Väst | 900 | 1 |
8 | Öst | 1300 | 1 |
Nyckelfunktion :
Funktionen DENSE_RANK() tilldelar rankningar som RANK(), men den hoppar inte över rankningar efter oavgjort.
Uppgift : Tilldela täta rankningar till försäljning inom varje region efter belopp (högst till lägst).
SELECT SalesID, Region, Amount, DENSE_RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS DenseRank FROM Sales;
Resultat :
Försäljnings-ID | Område | Belopp | DenseRank |
---|---|---|---|
1 | Norr | 1200 | 1 |
2 | Norr | 800 | 2 |
3 | Norr | 800 | 2 |
4 | Norr | 500 | 3 |
5 | Söder | 1300 | 1 |
6 | Söder | 700 | 2 |
7 | Väst | 900 | 1 |
8 | Öst | 1300 | 1 |
Nyckelfunktion :
NTILE() delar in rader i ett specificerat antal ungefär lika stora grupper.
Uppgift : Dela upp all försäljning i 4 grupper baserat på Belopp i fallande ordning.
SELECT SalesID, Amount, NTILE(4) OVER (ORDER BY Amount DESC) AS Quartile FROM Sales;
Resultat :
Försäljnings-ID | Belopp | Kvartil |
---|---|---|
5 | 1300 | 1 |
8 | 1300 | 1 |
1 | 1200 | 2 |
7 | 900 | 2 |
2 | 800 | 3 |
3 | 800 | 3 |
4 | 500 | 4 |
6 | 700 | 4 |
LEAD() hämtar värdet från nästa rad inom samma partition.
Uppgift : Jämför varje försäljningsbelopp med nästa försäljningsbelopp, sorterat efter SaleDate.
SELECT SalesID, Amount, LEAD(Amount) OVER (ORDER BY SaleDate) AS NextAmount FROM Sales;
Resultat :
Försäljnings-ID | Belopp | NextAmount |
---|---|---|
1 | 1200 | 800 |
2 | 800 | 800 |
3 | 800 | 500 |
4 | 500 | 1300 |
5 | 1300 | 700 |
6 | 700 | 900 |
7 | 900 | 1300 |
8 | 1300 | NULL |
LAG()
hämtar värdet från föregående rad inom samma partition.
Uppgift : Jämför varje försäljningsbelopp med det tidigare försäljningsbeloppet, sorterat efter SaleDate.
SELECT SalesID, Amount, LAG(Amount) OVER (ORDER BY SaleDate) AS PrevAmount FROM Sales;
Resultat :
Försäljnings-ID | Belopp | PrevAmount |
---|---|---|
1 | 1200 | NULL |
2 | 800 | 1200 |
3 | 800 | 800 |
4 | 500 | 800 |
5 | 1300 | 500 |
6 | 700 | 1300 |
7 | 900 | 700 |
8 | 1300 | 900 |
SQL-fönsterfunktioner som ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE(), LEAD() och LAG() ger kraftfulla sätt att analysera data inom partitioner.
Viktiga takeaways:
ROW_NUMBER()
tilldelar en unik identifierare för varje rad.RANK()
och DENSE_RANK()
skiljer sig åt i hur de hanterar kopplingar (hoppning kontra inget hoppande).NTILE()
är användbar för att dela in rader i statistikgrupper.LEAD()
och LAG()
tillåter jämförelser med intilliggande rader.
Genom att behärska dessa funktioner kan du hantera komplexa analyser och rankningsuppgifter effektivt!
Tack för att du tog dig tid att utforska datarelaterade insikter med mig. Jag uppskattar ditt engagemang. Om du tycker att denna information är användbar, inbjuder jag dig att följa mig eller kontakta mig på LinkedIn . Lycka till med att utforska!👋