logo

Funcții de fereastră în SQL

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.