logo

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