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ų.