Langų funkcijos yra galinga SQL funkcija, naudojama atlikti skaičiavimus su dabartine eilute susijusių eilučių rinkinyje. Skirtingai nei agregacinės funkcijos, lango funkcijos negrupuoja eilučių į vieną išvestį; jie pateikia kiekvienos eilutės rezultatą, išlaikydami duomenų rinkinio kontekstą.
Šiame straipsnyje su pavyzdžiais išnagrinėsime kai kurias dažniausiai naudojamas SQL lango funkcijas ( ROW_NUMBER()
, RANK()
, DENSE_RANK()
, NTILE()
, LEAD()
ir LAG()
).
Lango funkcijoms demonstruoti naudosime šią pardavimo lentelę:
Pardavimo ID | Kliento ID | Produktas | Regionas | Suma | Išpardavimo data |
---|---|---|---|---|---|
1 | 101 | Nešiojamasis kompiuteris | Šiaurė | 1200 | 2023-01-05 |
2 | 102 | Planšetinis kompiuteris | Šiaurė | 800 | 2023-02-15 |
3 | 103 | Telefonas | Šiaurė | 800 | 2023-03-10 |
4 | 104 | Planšetinis kompiuteris | Šiaurė | 500 | 2023-04-01 |
5 | 105 | Nešiojamasis kompiuteris | Pietų | 1300 | 2023-05-05 |
6 | 106 | Planšetinis kompiuteris | Pietų | 700 | 2023-06-20 |
7 | 107 | Telefonas | Vakarai | 900 | 2023-07-15 |
8 | 108 | Nešiojamasis kompiuteris | Rytai | 1300 | 2023-08-10 |
Funkcija ROW_NUMBER() kiekvienai skaidinio eilutei priskiria unikalų numerį, suskirstytą pagal nurodytą stulpelį.
Užduotis : kiekvienam regiono pardavimui priskirkite unikalų eilutės numerį, atsižvelgdami į pardavimo sumą (nuo didžiausios iki mažiausios).
SELECT SalesID, Region, Amount, ROW_NUMBER() OVER (PARTITION BY Region ORDER BY Amount DESC) AS RowNum FROM Sales;
Rezultatas :
Pardavimo ID | Regionas | Suma | EilutėsNum |
---|---|---|---|
1 | Šiaurė | 1200 | 1 |
2 | Šiaurė | 800 | 2 |
3 | Šiaurė | 800 | 3 |
4 | Šiaurė | 500 | 4 |
5 | Pietų | 1300 | 1 |
6 | Pietų | 700 | 2 |
7 | Vakarai | 900 | 1 |
8 | Rytai | 1300 | 1 |
Funkcija RANK() priskiria reitingą kiekvienai skaidinio eilutei. Eilutės su tomis pačiomis reikšmėmis gauna tą patį reitingą, o kitas reitingas praleidžiamas.
Užduotis : Įvertinkite pardavimus kiekviename regione pagal sumą (nuo didžiausio iki mažiausio).
SELECT SalesID, Region, Amount, RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS Rank FROM Sales;
Rezultatas :
Pardavimo ID | Regionas | Suma | Reitingas |
---|---|---|---|
1 | Šiaurė | 1200 | 1 |
2 | Šiaurė | 800 | 2 |
3 | Šiaurė | 800 | 2 |
4 | Šiaurė | 500 | 4 |
5 | Pietų | 1300 | 1 |
6 | Pietų | 700 | 2 |
7 | Vakarai | 900 | 1 |
8 | Rytai | 1300 | 1 |
Pagrindinė funkcija :
Funkcija DENSE_RANK() priskiria tokias eiles kaip RANK(), bet ji nepraleidžia eilių po lygiųjų.
Užduotis : priskirkite pardavimų tankius reitingus kiekviename regione pagal kiekį (nuo didžiausio iki mažiausio).
SELECT SalesID, Region, Amount, DENSE_RANK() OVER (PARTITION BY Region ORDER BY Amount DESC) AS DenseRank FROM Sales;
Rezultatas :
Pardavimo ID | Regionas | Suma | DenseRank |
---|---|---|---|
1 | Šiaurė | 1200 | 1 |
2 | Šiaurė | 800 | 2 |
3 | Šiaurė | 800 | 2 |
4 | Šiaurė | 500 | 3 |
5 | Pietų | 1300 | 1 |
6 | Pietų | 700 | 2 |
7 | Vakarai | 900 | 1 |
8 | Rytai | 1300 | 1 |
Pagrindinė funkcija :
NTILE() padalija eilutes į nurodytą skaičių maždaug vienodų grupių.
Užduotis : Padalinkite visus pardavimus į 4 grupes pagal sumą mažėjančia tvarka.
SELECT SalesID, Amount, NTILE(4) OVER (ORDER BY Amount DESC) AS Quartile FROM Sales;
Rezultatas :
Pardavimo ID | Suma | Kvartilis |
---|---|---|
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() nuskaito reikšmę iš kitos to paties skaidinio eilutės.
Užduotis : palyginkite kiekvieną pardavimo sumą su kita pardavimo suma, užsakyta pagal SaleDate.
SELECT SalesID, Amount, LEAD(Amount) OVER (ORDER BY SaleDate) AS NextAmount FROM Sales;
Rezultatas :
Pardavimo ID | Suma | KitasAmount |
---|---|---|
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()
nuskaito vertę iš ankstesnės eilutės tame pačiame skaidinyje.
Užduotis : palyginkite kiekvieną pardavimo sumą su ankstesne pardavimo suma, užsakyta pagal SaleDate.
SELECT SalesID, Amount, LAG(Amount) OVER (ORDER BY SaleDate) AS PrevAmount FROM Sales;
Rezultatas :
Pardavimo ID | Suma | Ankstesnė suma |
---|---|---|
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 lango funkcijos, tokios kaip ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE(), LEAD() ir LAG() suteikia galingų būdų analizuoti duomenis skaidiniuose.
Pagrindiniai patiekalai:
ROW_NUMBER()
kiekvienai eilutei priskiria unikalų identifikatorių.RANK()
ir DENSE_RANK()
skiriasi tuo, kaip jie tvarko ryšius (praleidžiant ir be praleidimo).NTILE()
naudinga skirstant eilutes į statistines grupes.LEAD()
ir LAG()
leidžia palyginti su gretimomis eilutėmis.
Įvaldę šias funkcijas, galite efektyviai atlikti sudėtingas analizės ir reitingavimo užduotis!
Dėkojame, kad skyrėte laiko su manimi tyrinėti su duomenimis susijusias įžvalgas. Aš vertinu jūsų sužadėtuves. Jei ši informacija jums naudinga, kviečiu jus sekti mane arba susisiekti su manimi LinkedIn . Smagaus tyrinėjimo! 👋