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