Ikkunafunktiot koskevat koonti- ja sijoitusfunktioita tietyssä ikkunassa (rivijoukossa). OVER-lausetta käytetään ikkunatoimintojen kanssa määrittämään kyseinen ikkuna. OVER-lause tekee kaksi asiaa:
- Osiot rivit muodostaaksesi rivijoukon. (PARTITION BY -lausetta käytetään)
- Järjestää näiden osioiden rivit tiettyyn järjestykseen. (ORDER BY -lausetta käytetään)
Huomautus: Jos osioita ei ole tehty, ORDER BY järjestää kaikki taulukon rivit.
Syntaksi:
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>
Aggregate Window Function
Erilaisia aggregaattifunktioita, kuten SUMMA(), COUNT(), AVERAGE(), MAX() ja MIN(), joita käytetään tietyssä ikkunassa (rivijoukossa), kutsutaan kokoomaikkunafunktioiksi.
Harkitse seuraavaa työntekijä pöytä :
| Nimi | Ikä | osasto | Palkka |
|---|---|---|---|
| Ramesh | kaksikymmentä | Rahoittaa | 50 000 |
| Syvä | 25 | Myynti | 30 000 |
| Suresh | 22 | Rahoittaa | 50 000 |
| RAM | 28 | Rahoittaa | 20 000 |
| Pradeep | 22 | Myynti | 20 000 |
Esimerkki -
Selvitä kunkin osaston työntekijöiden keskipalkka ja järjestele työntekijät osaston sisällä iän mukaan.
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary FROM employee>
Tämä tulostaa seuraavat:
| Nimi | Ikä | osasto | Palkka | Keskipalkka |
| Ramesh | kaksikymmentä | Rahoittaa | 50 000 | 40 000 |
| Suresh | 22 | Rahoittaa | 50 000 | 40 000 |
| RAM | 28 | Rahoittaa | 20 000 | 40 000 |
| Syvä | 25 | Myynti | 30 000 | 25 000 |
| Pradeep | 22 | Myynti | 20 000 | 25 000 |
Huomaa, kuinka kaikilla tietyn ikkunan keskipalkoilla on sama arvo.
Tarkastellaanpa toista tapausta:
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary FROM employee>
Täällä myös järjestämme tietueet osion sisällä ikäarvojen mukaan ja siten keskiarvot muuttuvat lajiteltujen sääntöjen mukaan.
Yllä olevan kyselyn tulos on:
| Nimi | Ikä | osasto | Palkka | Keskipalkka |
|---|---|---|---|---|
| Ramesh | kaksikymmentä | Rahoittaa | 50 000 | 50 000 |
| Suresh | 22 | Rahoittaa | 50 000 | 50 000 |
| RAM | 28 | Rahoittaa | 20 000 | 40 000 |
| Pradeep | 22 | Myynti | 20 000 | 20 000 |
| Syvä | 25 | Myynti | 30 000 | 25 000 |
Siksi meidän tulee olla varovaisia, kun lisäämme järjestystä lauseiden mukaan aggregaatteja sisältäviin ikkunafunktioihin.
Ranking-ikkunan toiminnot:
Sijoitusfunktiot ovat RANK(), DENSE_RANK(), ROW_NUMBER()
- RANK() –
Kuten nimestä voi päätellä, rank-funktio antaa sijoituksen jokaiselle osion kaikille riveille. Sijoitus asetetaan siten, että ensimmäiselle riville annettu sijoitus 1 ja saman arvon omaaville riveille annetaan sama arvo. Kahden saman arvoarvon jälkeen seuraavalla arvolla yksi arvo ohitetaan. Jos esimerkiksi kahdella rivillä on arvo 1, seuraava rivi saa sijan 3, ei 2.
- DENSE_RANK() –
Se määrittää sijoituksen jokaiselle osion riville. Aivan kuten rank-funktion ensimmäiselle riville on annettu sijoitus 1 ja riveillä, joilla on sama arvo, on sama arvo. Ero RANK():n ja DENSE_RANK():n välillä on se, että arvossa DENSE_RANK() kahden saman arvon jälkeiselle seuraavalle arvolle käytetään peräkkäistä kokonaislukua, eikä mitään arvoa ohiteta.
- ROW_NUMBER() –
ROW_NUMBER() antaa jokaiselle riville yksilöllisen numeron. Se numeroi rivit yhdestä rivien kokonaismäärään. Rivit on jaettu ryhmiin niiden arvojen perusteella. Jokaista ryhmää kutsutaan osioksi. Jokaisessa osiossa rivit saavat numerot peräkkäin. Osiossa ei ole kahdella rivillä samaa numeroa. Tämä tekee ROW_NUMBER() erilaisen arvoista RANK() ja DENSE_RANK(). ROW_NUMBER() tunnistaa yksilöllisesti jokaisen rivin peräkkäisellä kokonaisluvulla. Tämä auttaa erilaisissa data-analyyseissä.
Huomautus -
ORDER BY() tulee määrittää pakollisesti, kun käytetään rank-ikkunafunktioita.
Esimerkki -
Laske rivinro, sijoitus, työntekijöiden tiheys on työntekijätaulukko kunkin osaston palkan mukaan.
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;>
Yllä olevan kyselyn tulos on:
| emp_row_no | Nimi | osasto | Palkka | emp_rank | emp_dense_rank |
|---|---|---|---|---|---|
| 1 | Ramesh | Rahoittaa | 50 000 | 1 | 1 |
| 2 | Suresh | Rahoittaa | 50 000 | 1 | 1 |
| 3 | RAM | Rahoittaa | 20 000 | 3 | 2 |
| 1 | Syvä | Myynti | 30 000 | 1 | 1 |
| 2 | Pradeep | Myynti | 20 000 | 2 | 2 |
Joten voimme nähdä, että kuten ROW_NUMBER() määritelmässä mainittiin, rivinumerot ovat peräkkäisiä kokonaislukuja kussakin osiossa. Voimme myös nähdä eron arvon ja tiheän arvon välillä, että tiheässä arvossa ei ole aukkoa sijoitusarvojen välillä, kun taas toistuvan arvon jälkeen on eroa.
linux komennot