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.