Funkcie okien sa vzťahujú na agregačné a hodnotiace funkcie v konkrétnom okne (množine riadkov). Klauzula OVER sa používa s funkciami okna na definovanie tohto okna. Klauzula OVER robí dve veci:
- Rozdelí riadky tak, aby vytvorili množinu riadkov. (Použije sa klauzula PARTITION BY)
- Usporiada riadky v rámci týchto oddielov do konkrétneho poradia. (používa sa klauzula ORDER BY)
Poznámka: Ak oddiely nie sú hotové, potom ORDER BY zoradí všetky riadky tabuľky.
multiplexer
Syntax:
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>
Funkcia agregovaného okna
Rôzne agregačné funkcie ako SUM(), COUNT(), AVERAGE(), MAX() a MIN() aplikované na konkrétne okno (množinu riadkov) sa nazývajú funkcie agregovaného okna.
Zvážte nasledujúce zamestnanca tabuľka:
| názov | Vek | oddelenie | Plat |
|---|---|---|---|
| Ramesh | dvadsať | Financie | 50 000 |
| Hlboký | 25 | Predaj | 30 000 |
| Suresh | 22 | Financie | 50 000 |
| Ram | 28 | Financie | 20 000 |
| Pradeep | 22 | Predaj | 20 000 |
Príklad –
Nájdite priemerný plat zamestnancov pre každé oddelenie a zoraďte zamestnancov v rámci oddelenia podľa veku.
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary FROM employee>
Výsledkom je nasledovné:
| názov | Vek | oddelenie | Plat | Priemerný_plat |
| Ramesh | dvadsať | Financie | 50 000 | 40 000 |
| Suresh | 22 | Financie | 50 000 | 40 000 |
| Ram | 28 | Financie | 20 000 | 40 000 |
| Hlboký | 25 | Predaj | 30 000 | 25 000 |
| Pradeep | 22 | Predaj | 20 000 | 25 000 |
Všimnite si, ako majú všetky priemerné platy v konkrétnom okne rovnakú hodnotu.
Zoberme si iný prípad:
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary FROM employee>
Tu tiež zoraďujeme záznamy v rámci oddielu podľa vekových hodnôt, a teda priemerné hodnoty sa menia podľa zoradeného poradia.
Výstup vyššie uvedeného dotazu bude:
| názov | Vek | oddelenie | Plat | Priemerný_plat |
|---|---|---|---|---|
| Ramesh | dvadsať | Financie | 50 000 | 50 000 |
| Suresh | 22 | Financie | 50 000 | 50 000 |
| Ram | 28 | Financie | 20 000 | 40 000 |
| Pradeep | 22 | Predaj | 20 000 | 20 000 |
| Hlboký | 25 | Predaj | 30 000 | 25 000 |
Preto by sme mali byť opatrní pri pridávaní poradia podľa klauzúl do funkcií okna s agregátmi.
Funkcie okna hodnotenia:
Hodnotiace funkcie sú: RANK(), DENSE_RANK(), ROW_NUMBER()
- RANK() –
Ako už názov napovedá, funkcia hodnotenia priraďuje hodnotenie všetkým riadkom v rámci každého oddielu. Poradie je priradené tak, že poradie 1 priradené prvému riadku a riadky s rovnakou hodnotou majú priradené rovnaké poradie. Pre ďalšie poradie po dvoch rovnakých hodnotách poradia sa jedna hodnota poradia preskočí. Napríklad, ak dva riadky zdieľajú poradie 1, ďalší riadok dostane poradie 3, nie 2.
- DENSE_RANK() –
Každému riadku v rámci oddielu priraďuje poradie. Rovnako ako funkcii hodnotenia je prvému riadku priradené poradie 1 a riadky s rovnakou hodnotou majú rovnaké poradie. Rozdiel medzi RANK() a DENSE_RANK() je v tom, že v DENSE_RANK() sa pre ďalšie poradie po dvoch rovnakých hodnotách použije po sebe idúce celé číslo, žiadne poradie sa nepreskočí.
- ROW_NUMBER() –
ROW_NUMBER() dáva každému riadku jedinečné číslo. Očísluje riadky od jedného po celkový počet riadkov. Riadky sú rozdelené do skupín na základe ich hodnôt. Každá skupina sa nazýva oddiel. V každej partícii sú riadky postupne číslované. Žiadne dva riadky nemajú v oddiele rovnaké číslo. Tým sa ROW_NUMBER() líši od RANK() a DENSE_RANK(). ROW_NUMBER() jedinečne identifikuje každý riadok sekvenčným celým číslom. Pomáha to pri rôznych druhoch analýzy údajov.
Poznámka -
ORDER BY() by malo byť zadané povinne pri používaní funkcií okna poradia.
Príklad –
Vypočítajte riadok č., hodnosť, husté poradie zamestnancov je tabuľka zamestnancov podľa platu v rámci každého oddelenia.
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;>
Výstup vyššie uvedeného dotazu bude:
| emp_row_no | názov | oddelenie | Plat | emp_rank | emp_dense_rank |
|---|---|---|---|---|---|
| 1 | Ramesh | Financie | 50 000 | 1 | 1 |
| 2 | Suresh | Financie | 50 000 | 1 | 1 |
| 3 | Ram | Financie | 20 000 | 3 | 2 |
| 1 | Hlboký | Predaj | 30 000 | 1 | 1 |
| 2 | Pradeep | Predaj | 20 000 | 2 | 2 |
Môžeme teda vidieť, že ako je uvedené v definícii ROW_NUMBER(), čísla riadkov sú po sebe idúce celé čísla v rámci každého oddielu. Tiež môžeme vidieť rozdiel medzi poradím a hustým poradím, že v hustom poradí nie je žiadna medzera medzi hodnotami poradia, zatiaľ čo po opakovanom poradí je medzera v hodnotách poradia.
java do while príklad