logo

Okenske funkcije v SQL

Okenske funkcije veljajo za funkcije združevanja in razvrščanja v določenem oknu (niz vrstic). Klavzula OVER se uporablja z okenskimi funkcijami za definiranje tega okna. Klavzula OVER naredi dve stvari:

  • Razdeli vrstice, da tvori nabor vrstic. (uporabljena je klavzula PARTITION BY)
  • Razporedi vrstice znotraj teh particij v določen vrstni red. (uporablja se klavzula ORDER BY)

Opomba: Če particije niso narejene, potem ORDER BY razvrsti vse vrstice tabele.

Sintaksa:



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>

Funkcija skupnega okna
Različne agregatne funkcije, kot so SUM(), COUNT(), AVERAGE(), MAX() in MIN(), uporabljene v določenem oknu (niz vrstic), se imenujejo agregatne okenske funkcije.

Razmislite o naslednjem zaposleni miza:

Ime Starost Oddelek Plača
Ramesh dvajset Finance 50.000
Globoko 25 Prodaja 30.000
Suresh 22 Finance 50000
Oven 28 Finance 20.000
Pradeep 22 Prodaja 20.000

Primer –
Poiščite povprečno plačo zaposlenih za vsak oddelek in razvrstite zaposlene znotraj oddelka po starosti.

SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary  FROM employee>

To izpiše naslednje:

Ime Starost Oddelek Plača Avg_Salary
Ramesh dvajset Finance 50.000 40.000
Suresh 22 Finance 50.000 40.000
Oven 28 Finance 20.000 40.000
Globoko 25 Prodaja 30.000 25.000
Pradeep 22 Prodaja 20.000 25.000

Opazite, kako imajo vse povprečne plače v določenem oknu enako vrednost.

Razmislimo o drugem primeru:

SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary  FROM employee>

Tukaj tudi razvrstimo zapise znotraj particije glede na starostne vrednosti, zato se povprečne vrednosti spreminjajo glede na razvrščeni vrstni red.
Rezultat zgornje poizvedbe bo:

Ime Starost Oddelek Plača Avg_Salary
Ramesh dvajset Finance 50.000 50.000
Suresh 22 Finance 50.000 50.000
Oven 28 Finance 20.000 40.000
Pradeep 22 Prodaja 20.000 20.000
Globoko 25 Prodaja 30.000 25.000

Zato moramo biti previdni pri dodajanju vrstnega reda glede na klavzule okenskim funkcijam z agregati.

Funkcije okna za razvrščanje:
Funkcije razvrščanja so RANK(), DENSE_RANK(), ROW_NUMBER()

  • RANK() –
    Kot že ime pove, funkcija ranga dodeli rang vsem vrsticam znotraj vsake particije. Rang je dodeljen tako, da je rang 1, dodeljen prvi vrstici, in vrsticam z enako vrednostjo dodeljen enak rang. Za naslednji rang po dveh enakih vrednostih ranga bo ena vrednost ranga preskočena. Na primer, če si dve vrstici delita rang 1, naslednja vrstica dobi rang 3, ne 2.
  • DENSE_RANK() –
    Vsaki vrstici znotraj particije dodeli rang. Tako kot funkcija rangiranja je prvi vrstici dodeljen rang 1 in vrstice z enako vrednostjo imajo enak rang. Razlika med RANK() in DENSE_RANK() je v tem, da se pri DENSE_RANK() za naslednji rang po dveh enakih rangih uporabi zaporedno celo število, noben rang se ne preskoči.
  • ROW_NUMBER() –
    ROW_NUMBER() daje vsaki vrstici edinstveno številko. Oštevilči vrstice od ena do vseh vrstic. Vrstice so razvrščene v skupine glede na njihove vrednosti. Vsaka skupina se imenuje particija. V vsaki particiji se vrstice ena za drugo oštevilčujejo. Nobena vrstica nima iste številke v particiji. Zaradi tega se ROW_NUMBER() razlikuje od RANK() in DENSE_RANK(). ROW_NUMBER() enolično identificira vsako vrstico z zaporedno celim številom. To pomaga pri različnih vrstah analiz podatkov.

Opomba -
ORDER BY() je treba obvezno določiti pri uporabi funkcij okenskega ranga.

Primer –
Izračunajte št. vrstice, čin, gosto vrstni red zaposlenih je tabela zaposlenih glede na plačo znotraj posameznega oddelka.

preimenuj mapo linux
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;>

Rezultat zgornje poizvedbe bo:

emp_row_no Ime Oddelek Plača emp_rank emp_dense_rank
1 Ramesh Finance 50.000 1 1
2 Suresh Finance 50.000 1 1
3 Oven Finance 20.000 3 2
1 Globoko Prodaja 30.000 1 1
2 Pradeep Prodaja 20.000 2 2

Torej lahko vidimo, da so številke vrstic, kot je omenjeno v definiciji ROW_NUMBER(), zaporedna cela števila znotraj vsake particije. Prav tako lahko vidimo razliko med rangom in gostim rangom, da v gostem rangu ni vrzeli med vrednostmi ranga, medtem ko je vrzel v vrednosti ranga po ponovljenem rangu.