Funcțiile de fereastră se aplică funcțiilor de agregare și de clasare într-o anumită fereastră (set de rânduri). Clauza OVER este utilizată cu funcțiile ferestrei pentru a defini acea fereastră. Clauza OVER face două lucruri:
- Împărțiți rândurile pentru a forma un set de rânduri. (Se folosește clauza PARTITION BY)
- Comandă rândurile din acele partiții într-o anumită ordine. (Se folosește clauza ORDER BY)
Notă: Dacă partițiile nu sunt făcute, atunci ORDER BY ordonează toate rândurile tabelului.
Sintaxă:
gzip pentru Linux
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>
Funcția Fereastra agregată
Diverse funcții agregate, cum ar fi SUM(), COUNT(), AVERAGE(), MAX() și MIN() aplicate într-o anumită fereastră (set de rânduri) sunt numite funcții de fereastră agregată.
Luați în considerare următoarele angajat masa :
| Nume | Vârstă | Departament | Salariu |
|---|---|---|---|
| Ramesh | douăzeci | Finanţa | 50.000 |
| Adânc | 25 | Vânzări | 30.000 |
| Suresh | 22 | Finanţa | 50000 |
| RAM | 28 | Finanţa | 20.000 |
| Pradeep | 22 | Vânzări | 20.000 |
Exemplu –
Găsiți salariul mediu al angajaților pentru fiecare departament și ordonați angajații dintr-un departament în funcție de vârstă.
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary FROM employee>
Aceasta produce următoarele:
| Nume | Vârstă | Departament | Salariu | Salariu_mediu |
| Ramesh | douăzeci | Finanţa | 50.000 | 40.000 |
| Suresh | 22 | Finanţa | 50.000 | 40.000 |
| RAM | 28 | Finanţa | 20.000 | 40.000 |
| Adânc | 25 | Vânzări | 30.000 | 25.000 |
| Pradeep | 22 | Vânzări | 20.000 | 25.000 |
Observați cum toate salariile medii dintr-o anumită fereastră au aceeași valoare.
Să luăm în considerare un alt caz:
SELECT Name, Age, Department, Salary, AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary FROM employee>
Aici, de asemenea, ordonăm înregistrările din partiție în funcție de valorile vârstei și, prin urmare, valorile medii se modifică conform ordinii sortate.
Rezultatul interogării de mai sus va fi:
| Nume | Vârstă | Departament | Salariu | Salariu_mediu |
|---|---|---|---|---|
| Ramesh | douăzeci | Finanţa | 50.000 | 50.000 |
| Suresh | 22 | Finanţa | 50.000 | 50.000 |
| RAM | 28 | Finanţa | 20.000 | 40.000 |
| Pradeep | 22 | Vânzări | 20.000 | 20.000 |
| Adânc | 25 | Vânzări | 30.000 | 25.000 |
Prin urmare, ar trebui să fim atenți când adăugăm clauze ordonate la funcțiile ferestrei cu agregate.
alter add coloana oracol
Funcții ale ferestrei de clasare:
Funcțiile de clasare sunt: RANK(), DENSE_RANK(), ROW_NUMBER()
- RANG() -
După cum sugerează și numele, funcția de rang atribuie rang tuturor rândurilor din fiecare partiție. Rangul este atribuit astfel încât rangul 1 dat primului rând și rândurilor care au aceeași valoare li se atribuie același rang. Pentru următorul rang după două valori de rang similar, o valoare de rang va fi omisă. De exemplu, dacă două rânduri împart rangul 1, următorul rând devine rangul 3, nu 2.
- DENSE_RANK() –
Atribuie rang fiecărui rând din partiție. La fel cum funcția de rang, primul rând este atribuit rangul 1 și rândurile cu aceeași valoare au același rang. Diferența dintre RANK() și DENSE_RANK() este că în DENSE_RANK(), pentru următorul rang după două aceleași ranguri, este folosit un întreg consecutiv, niciun rang nu este omis.
- ROW_NUMBER() –
ROW_NUMBER() dă fiecărui rând un număr unic. Numerează rândurile de la unul la numărul total de rânduri. Rândurile sunt puse în grupuri în funcție de valorile lor. Fiecare grup se numește partiție. În fiecare partiție, rândurile primesc numere unul după altul. Nu există două rânduri să aibă același număr într-o partiție. Acest lucru face ca ROW_NUMBER() să fie diferit de RANK() și DENSE_RANK(). ROW_NUMBER() identifică în mod unic fiecare rând cu un număr întreg secvenţial. Acest lucru ajută la diferite tipuri de analiză a datelor.
Notă -
ORDER BY() ar trebui să fie specificat în mod obligatoriu în timpul utilizării funcțiilor ferestrei de rang.
Exemplu –
Calculați numărul rândului, rangul, rangul dens al angajaților este tabelul angajaților în funcție de salariul din fiecare departament.
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;>
Rezultatul interogării de mai sus va fi:
| emp_row_no | Nume | Departament | Salariu | emp_rank | emp_dense_rank |
|---|---|---|---|---|---|
| 1 | Ramesh | Finanţa | 50.000 | 1 | 1 |
| 2 | Suresh | Finanţa | 50.000 | 1 | 1 |
| 3 | RAM | Finanţa | 20.000 | 3 | 2 |
| 1 | Adânc | Vânzări | 30.000 | 1 | 1 |
| 2 | Pradeep | Vânzări | 20.000 | 2 | 2 |
Deci, putem vedea că, așa cum este menționat în definiția ROW_NUMBER(), numerele de rând sunt numere întregi consecutive în cadrul fiecărei partiții. De asemenea, putem vedea o diferență între rang și rang dens că, în rang dens, nu există un decalaj între valorile rangului, în timp ce există un decalaj în valorile rangului după rangul repetat.