paint-brush
Funkcije SQL prozora: Brzi pregled s primjerimaby@luca1iu
Nova istorija

Funkcije SQL prozora: Brzi pregled s primjerima

by Luca Liu5m2025/01/05
Read on Terminal Reader

Predugo; Citati

Funkcije prozora su moćna karakteristika u SQL-u koja se koristi za izvođenje proračuna u nizu redova koji se odnose na trenutni red. Za razliku od agregatnih funkcija, funkcije prozora ne grupišu redove u jedan izlaz. Oni vraćaju rezultat za svaki red dok zadržavaju kontekst skupa podataka.
featured image - Funkcije SQL prozora: Brzi pregled s primjerima
Luca Liu HackerNoon profile picture


Uvod

Funkcije prozora su moćna karakteristika u SQL-u koja se koristi za izvođenje proračuna u nizu redova koji se odnose na trenutni red. Za razliku od agregatnih funkcija, funkcije prozora ne grupišu redove u jedan izlaz; vraćaju rezultat za svaki red dok zadržavaju kontekst skupa podataka.


U ovom članku ćemo istražiti neke najčešće korištene SQL funkcije prozora ( ROW_NUMBER() , RANK() , DENSE_RANK() , NTILE() , LEAD() i LAG() ) s primjerima.

Uzorak tabele: Podaci o prodaji

Koristit ćemo sljedeću tablicu prodaje da demonstriramo funkcije prozora:

SalesID

CustomerID

Proizvod

Region

Iznos

SaleDate

1

101

Laptop

Sjever

1200

2023-01-05

2

102

Tablet

Sjever

800

2023-02-15

3

103

Telefon

Sjever

800

2023-03-10

4

104

Tablet

Sjever

500

2023-04-01

5

105

Laptop

Jug

1300

2023-05-05

6

106

Tablet

Jug

700

2023-06-20

7

107

Telefon

Zapad

900

2023-07-15

8

108

Laptop

Istok

1300

2023-08-10

1. ROW_NUMBER()

Funkcija ROW_NUMBER() dodjeljuje jedinstveni broj svakom redu unutar particije, poredan prema navedenoj koloni.


Zadatak : Dodijelite jedinstveni broj reda svakoj prodaji unutar regije na osnovu iznosa prodaje (od najvećeg do najmanjeg).

 SELECT SalesID, Region, Amount, ROW_NUMBER() OVER (PARTITION BY Region ORDER BY Amount DESC) AS RowNum FROM Sales;

Rezultat :

SalesID

Region

Iznos

RowNum

1

Sjever

1200

1

2

Sjever

800

2

3

Sjever

800

3

4

Sjever

500

4

5

Jug

1300

1

6

Jug

700

2

7

Zapad

900

1

8

Istok

1300

1

2. RANK()

Funkcija RANK() dodjeljuje rang svakom redu unutar particije. Redovi sa istim vrednostima dobijaju isti rang, a sledeći rang se preskače.


Zadatak : Rasporedite prodaju unutar svake regije prema iznosu (najviše prema najnižem).

 SELECT SalesID, Region, Amount, RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS Rank FROM Sales;

Rezultat :

SalesID

Region

Iznos

Rang

1

Sjever

1200

1

2

Sjever

800

2

3

Sjever

800

2

4

Sjever

500

4

5

Jug

1300

1

6

Jug

700

2

7

Zapad

900

1

8

Istok

1300

1

Ključna karakteristika :

  • Za regiju Sjever, oba iznosa = 800 reda dijele rang 2.


  • Sljedeći rang se preskače (tj. rang 3 nedostaje) i skače na 4.

3. DENSE_RANK()

Funkcija DENSE_RANK() dodeljuje rangove poput RANK(), ali ne preskače rangove nakon izjednačenja.


Zadatak : Dodijelite guste rangove prodaje unutar svake regije prema iznosu (najviše prema najnižem).

 SELECT SalesID, Region, Amount, DENSE_RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS DenseRank FROM Sales;

Rezultat :

SalesID

Region

Iznos

DenseRank

1

Sjever

1200

1

2

Sjever

800

2

3

Sjever

800

2

4

Sjever

500

3

5

Jug

1300

1

6

Jug

700

2

7

Zapad

900

1

8

Istok

1300

1

Ključna karakteristika :

  • Za regiju Sjever, oba iznosa = 800 reda dijele rang 2.


  • Sljedeći rang je 3, bez preskakanja redova.

4. NTILE()

NTILE() dijeli redove na određeni broj približno jednakih grupa.


Zadatak : Podijelite svu prodaju u 4 grupe na osnovu iznosa u opadajućem redoslijedu.

 SELECT SalesID, Amount, NTILE(4) OVER (ORDER BY Amount DESC) AS Quartile FROM Sales;

Rezultat :

SalesID

Iznos

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() dohvaća vrijednost iz sljedećeg reda unutar iste particije.


Zadatak : Uporedite svaki iznos prodaje sa sljedećim iznosom prodaje, poredanim po SaleDate.

 SELECT SalesID, Amount, LEAD(Amount) OVER (ORDER BY SaleDate) AS NextAmount FROM Sales;

Rezultat :

SalesID

Iznos

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() dohvaća vrijednost iz prethodnog reda unutar iste particije.


Zadatak : Uporedite svaki iznos prodaje s prethodnim iznosom prodaje, poredanim po SaleDate.

 SELECT SalesID, Amount, LAG(Amount) OVER (ORDER BY SaleDate) AS PrevAmount FROM Sales;

Rezultat :

SalesID

Iznos

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

Zaključak

Funkcije SQL prozora kao što su ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE(), LEAD() i LAG() pružaju moćne načine za analizu podataka unutar particija.


Ključni za poneti:

  • ROW_NUMBER() dodjeljuje jedinstveni identifikator za svaki red.
  • RANK() i DENSE_RANK() se razlikuju po načinu na koji rukuju vezama (preskakanje naspram bez preskakanja).
  • NTILE() je koristan za podelu redova u statističke grupe.
  • LEAD() i LAG() dozvoljavaju poređenje sa susednim redovima.


Savladavanjem ovih funkcija, možete efikasno rješavati složene zadatke analitike i rangiranja!


Hvala vam što ste odvojili vrijeme da zajedno sa mnom istražite uvide u vezi s podacima. Cijenim tvoj angažman. Ako smatrate da su vam ove informacije korisne, pozivam vas da me pratite ili se povežete sa mnom na LinkedIn-u . Sretno istraživanje!👋

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

HANG TAGS

OVAJ ČLANAK JE PREDSTAVLJEN U...