Langų funkcijos SQL
Lango funkcijos taikomos konkretaus lango (eilučių rinkinio) agregavimo ir reitingavimo funkcijoms. Sąlyga OVER naudojama su lango funkcijomis tam langui apibrėžti. OVER sąlyga atlieka du dalykus:
- Padalinkite eilutes, kad sudarytumėte eilučių rinkinį. (Naudojama sąlyga PARTITION BY)
- Tuose skirsniuose eilutes išdėsto tam tikra tvarka. (Naudojamas punktas ORDER BY)
Pastaba: Jei skaidiniai neatlikti, tada ORDER BY sutvarko visas lentelės eilutes.
Sintaksė:
SELECT coulmn_name1, window_function(cloumn_name2) OVER([PARTITION BY column_name1] [ORDER BY column_name3]) AS new_column FROM table_name; window_function= any aggregate or ranking function column_name1 = column to be selected coulmn_name2= column on which window function is to be applied column_name3 = column on whose basis partition of rows is to be done new_column= Name of new column table_name= Name of table
Suvestinė lango funkcija
Įvairios agregacinės funkcijos, tokios kaip SUM(), COUNT(), AVERAGE(), MAX() ir MIN(), taikomos tam tikram langui (eilučių rinkiniui), vadinamos agregato lango funkcijomis.
Apsvarstykite šiuos dalykus darbuotojas lentelė:
| vardas | Amžius | skyrius | Atlyginimas |
|---|---|---|---|
| Ramešas | dvidešimt | Finansai | 50 000 |
| Giliai | 25 | Pardavimai | 30 000 |
| Suresh | 22 | Finansai | 50 000 |
| Ram | 28 | Finansai | 20 000 |
| Pradeep | 22 | Pardavimai | 20 000 |
Pavyzdys -
Raskite vidutinį kiekvieno skyriaus darbuotojų atlyginimą ir suskirstykite darbuotojus skyriuje pagal amžių.
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary FROM employee
Tai išveda šiuos duomenis:
| vardas | Amžius | skyrius | Atlyginimas | Vid._atlyginimas |
| Ramešas | dvidešimt | Finansai | 50 000 | 40 000 |
| Suresh | 22 | Finansai | 50 000 | 40 000 |
| Ram | 28 | Finansai | 20 000 | 40 000 |
| Giliai | 25 | Pardavimai | 30 000 | 25 000 |
| Pradeep | 22 | Pardavimai | 20 000 | 25 000 |
Atkreipkite dėmesį, kaip visi vidutiniai atlyginimai tam tikrame lange yra vienodi.
Panagrinėkime kitą atvejį:
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary FROM employee
Čia taip pat išdėstome įrašus skaidinyje pagal amžiaus reikšmes, todėl vidutinės reikšmės keičiasi pagal rūšiavimo tvarką.
Aukščiau pateiktos užklausos išvestis bus tokia:
| vardas | Amžius | skyrius | Atlyginimas | Vid._atlyginimas |
|---|---|---|---|---|
| Ramešas | dvidešimt | Finansai | 50 000 | 50 000 |
| Suresh | 22 | Finansai | 50 000 | 50 000 |
| Ram | 28 | Finansai | 20 000 | 40 000 |
| Pradeep | 22 | Pardavimai | 20 000 | 20 000 |
| Giliai | 25 | Pardavimai | 30 000 | 25 000 |
Todėl turėtume būti atsargūs, langų funkcijoms su agregatais įtraukdami tvarką pagal sakinius.
Reitingavimo lango funkcijos:
Reitingavimo funkcijos yra RANK(), DENSE_RANK(), ROW_NUMBER()
- RANK () –
Kaip rodo pavadinimas, rango funkcija priskiria reitingą visoms kiekvienos skaidinio eilutėms. Reitingas priskiriamas taip, kad pirmai eilutei suteiktas 1 rangas, o eilutėms, kurių reikšmė yra tokia pati, priskiriamas toks pat rangas. Kitame reitinge po dviejų tų pačių rango verčių viena rango reikšmė bus praleista. Pavyzdžiui, jei dvi eilutės turi 1 reitingą, kita eilutė gauna 3, o ne 2 reitingą.
- DENSE_RANK() –
Jis priskiria reitingą kiekvienai skaidinio eilutei. Kaip ir rango funkcija, pirmajai eilutei priskiriamas 1 rangas, o eilutėms, turinčioms tą pačią reikšmę, yra tas pats rangas. Skirtumas tarp RANK() ir DENSE_RANK() yra tas, kad DENSE_RANK() kitam rangui po dviejų tų pačių reitingų naudojamas sveikasis skaičius iš eilės, joks rangas nepraleidžiamas.
- ROW_NUMBER() –
ROW_NUMBER() kiekvienai eilutei suteikia unikalų numerį. Jis sunumeruoja eilutes nuo vienos iki visų eilučių. Eilutės suskirstytos į grupes pagal jų vertes. Kiekviena grupė vadinama skaidiniu. Kiekviename skirsnyje eilutės viena po kitos gauna skaičius. Dviejų eilučių skaidinyje nėra vienodo numerio. Dėl to ROW_NUMBER() skiriasi nuo RANK() ir DENSE_RANK(). ROW_NUMBER() unikaliai identifikuoja kiekvieną eilutę su sveikuoju skaičiumi. Tai padeda atlikti įvairių rūšių duomenų analizę.
Pastaba -
ORDER BY() turi būti nurodytas privalomai naudojant rango lango funkcijas.
Pavyzdys -
Apskaičiuokite eilutę Nr., rangą, tankų darbuotojų rangą yra darbuotojų lentelė pagal atlyginimą kiekviename padalinyje.
SELECT ROW_NUMBER() OVER (PARTITION BY Department ORDER BY Salary DESC) AS emp_row_no, Name, Department, Salary, RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_rank, DENSE_RANK() OVER(PARTITION BY Department ORDER BY Salary DESC) AS emp_dense_rank FROM employee;
Aukščiau pateiktos užklausos išvestis bus tokia:
| emp_row_no | vardas | skyrius | Atlyginimas | emp_rank | emp_dense_rank |
|---|---|---|---|---|---|
| 1 | Ramešas | Finansai | 50 000 | 1 | 1 |
| 2 | Suresh | Finansai | 50 000 | 1 | 1 |
| 3 | Ram | Finansai | 20 000 | 3 | 2 |
| 1 | Giliai | Pardavimai | 30 000 | 1 | 1 |
| 2 | Pradeep | Pardavimai | 20 000 | 2 | 2 |
Taigi, matome, kad, kaip minėta ROW_NUMBER() apibrėžime, eilučių numeriai yra sveikieji skaičiai kiekviename skaidinyje. Taip pat matome skirtumą tarp rango ir tankaus rango, kad esant tankiam rangui nėra atotrūkio tarp rango reikšmių, o po pakartotinio rango yra atotrūkis tarp rango verčių.