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.