logo

Funzioni finestra in SQL

Le funzioni finestra si applicano alle funzioni di aggregazione e classificazione su una particolare finestra (insieme di righe). La clausola OVER viene utilizzata con le funzioni finestra per definire quella finestra. La clausola OVER fa due cose:

  • Partiziona le righe per formare un insieme di righe. (Viene utilizzata la clausola PARTITION BY)
  • Ordina le righe all'interno di tali partizioni in un ordine particolare. (Viene utilizzata la clausola ORDER BY)

Nota: Se le partizioni non vengono completate, ORDER BY ordina tutte le righe della tabella.

Sintassi:



char a intero java
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>

Funzione finestra aggregata
Varie funzioni aggregate come SUM(), COUNT(), AVERAGE(), MAX() e MIN() applicate su una particolare finestra (insieme di righe) sono chiamate funzioni di finestra aggregate.

Considera quanto segue dipendente tavolo :

Nome Età Dipartimento Stipendio
Ramesh venti Finanza 50.000
Profondo 25 Saldi 30.000
Certo 22 Finanza 50000
Ram 28 Finanza 20.000
Pradeep 22 Saldi 20.000

Esempio -
Trova lo stipendio medio dei dipendenti per ciascun dipartimento e ordina i dipendenti all'interno di un dipartimento per età.

converte un int in una stringa java
SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department) AS Avg_Salary  FROM employee>

Questo restituisce quanto segue:

Nome Età Dipartimento Stipendio Stipendio_avg
Ramesh venti Finanza 50.000 40.000
Certo 22 Finanza 50.000 40.000
Ram 28 Finanza 20.000 40.000
Profondo 25 Saldi 30.000 25.000
Pradeep 22 Saldi 20.000 25.000

Nota come tutti gli stipendi medi in una particolare finestra hanno lo stesso valore.

Consideriamo un altro caso:

SELECT Name, Age, Department, Salary,   AVG(Salary) OVER( PARTITION BY Department ORDER BY Age) AS Avg_Salary  FROM employee>

Qui ordiniamo anche i record all'interno della partizione in base ai valori di età e quindi i valori medi cambiano secondo l'ordinamento.
L'output della query precedente sarà:

Nome Età Dipartimento Stipendio Stipendio_avg
Ramesh venti Finanza 50.000 50.000
Certo 22 Finanza 50.000 50.000
Ram 28 Finanza 20.000 40.000
Pradeep 22 Saldi 20.000 20.000
Profondo 25 Saldi 30.000 25.000

Pertanto, dovremmo fare attenzione quando aggiungiamo clausole order by alle funzioni finestra con aggregati.

Funzioni della finestra di classifica:
Le funzioni di classificazione sono RANK(), DENSE_RANK(), ROW_NUMBER()

  • RANGO() -
    Come suggerisce il nome, la funzione rango assegna il rango a tutte le righe all'interno di ogni partizione. Il rango viene assegnato in modo tale che il rango 1 assegnato alla prima riga e alle righe con lo stesso valore venga assegnato lo stesso rango. Per la classifica successiva dopo due valori di classifica uguali, un valore di classifica verrà saltato. Ad esempio, se due righe condividono il rango 1, la riga successiva ottiene il rango 3 e non 2.
  • DENSO_RANGO() –
    Assegna il rango a ciascuna riga all'interno della partizione. Proprio come la funzione di rango, alla prima riga viene assegnato il rango 1 e le righe con lo stesso valore hanno lo stesso rango. La differenza tra RANK() e DENSE_RANK() è che in DENSE_RANK(), per il rango successivo dopo due ranghi uguali, viene utilizzato un numero intero consecutivo, nessun rango viene saltato.
  • NUMERO_RIGA() –
    ROW_NUMBER() assegna a ciascuna riga un numero univoco. Numera le righe da una alle righe totali. Le righe vengono inserite in gruppi in base ai relativi valori. Ogni gruppo è chiamato partizione. In ogni partizione, le righe ricevono numeri una dopo l'altra. Non esistono due righe con lo stesso numero in una partizione. Ciò rende ROW_NUMBER() diverso da RANK() e DENSE_RANK(). ROW_NUMBER() identifica in modo univoco ogni riga con un numero intero sequenziale. Questo aiuta con diversi tipi di analisi dei dati.

Nota -
ORDER BY() deve essere specificato obbligatoriamente durante l'utilizzo delle funzioni della finestra di classificazione.

Esempio -
Calcola il numero di riga, il grado, il grado denso dei dipendenti nella tabella dei dipendenti in base allo stipendio all'interno di ciascun dipartimento.

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;>

L'output della query precedente sarà:

panda che creano dataframe
emp_row_no Nome Dipartimento Stipendio emp_rank emp_dense_rank
1 Ramesh Finanza 50.000 1 1
2 Certo Finanza 50.000 1 1
3 Ram Finanza 20.000 3 2
1 Profondo Saldi 30.000 1 1
2 Pradeep Saldi 20.000 2 2

Quindi, possiamo vedere che, come menzionato nella definizione di ROW_NUMBER(), i numeri di riga sono numeri interi consecutivi all'interno di ciascuna partizione. Inoltre, possiamo vedere la differenza tra rango e rango denso che nel rango denso non c'è divario tra i valori di rango mentre c'è un divario nei valori di rango dopo il rango ripetuto.