logo

Funkcie okien v SQL

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