paint-brush
SQL-fönsterfunktioner: En snabb recension med exempelförbi@luca1iu
Ny historia

SQL-fönsterfunktioner: En snabb recension med exempel

förbi Luca Liu5m2025/01/05
Read on Terminal Reader

För länge; Att läsa

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.
featured image - SQL-fönsterfunktioner: En snabb recension med exempel
Luca Liu HackerNoon profile picture


Introduktion

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.

Exempeltabell: Försäljningsdata

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

1. ROW_NUMBER()

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

2. RANK()

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 :

  • För den norra regionen delar båda Belopp = 800 rader rang 2.


  • Nästa rankning hoppas över (dvs. rank 3 saknas) och hoppar till 4.

3. DENSE_RANK()

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 :

  • För den norra regionen delar båda Belopp = 800 rader rang 2.


  • Nästa rang är 3, utan att hoppa över rangordningen.

4. NTILE()

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

5. LEAD()

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

6. LAG()

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

Slutsats

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!👋

L O A D I N G
. . . comments & more!

About Author

Luca Liu HackerNoon profile picture
Luca Liu@luca1iu
Hello there! 👋 I'm Luca, a BI Developer with a passion for all things data, Proficient in Python, SQL and Power BI

HÄNG TAGGAR

DENNA ARTIKEL PRESENTERAS I...