La clausola SQL OVER (): quando e perché è utile?

Quindi, in parole semplici: la clausola Over può essere utilizzata per selezionare valori non aggregati insieme a quelli aggregati.

Partition BY, ORDER BY inside e ROWS o RANGE fanno parte della clausola OVER () by.

partition by viene utilizzato per partizionare i dati e quindi eseguire queste finestre, funzioni aggregate e se non lo facciamo avere partizione per l’intero set di risultati è considerato come una singola partizione.

Vediamo la sintassi di base della clausola OVER

PARTIZIONE PER: viene utilizzata per partizionare i dati ed eseguire operazioni su gruppi con gli stessi dati.

ORDINA PER: viene utilizzata per definire l’ordine logico dei dati nelle partizioni. Quando non specifichiamo Partition, l’intero set di risultati viene considerato come una singola partizione

: questo può essere usato per specificare quali righe dovrebbero essere considerate in una partizione durante l’esecuzione dell’operazione.

Facciamo un esempio:

Ecco il mio set di dati:

Quindi fammi eseguire diversi scenari e vedere come vengono influenzati i dati e passerò dalla sintassi difficile al semplice uno

Osserva solo la parte sum_sal. Qui sto usando order by Salary e utilizzo “RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW”. In questo caso, non stiamo usando la partizione quindi tutti i dati saranno trattati come uno partizione e stiamo ordinando sullo stipendio.E la cosa importante qui è UNBOUNDED PRECEDING AND CURRENT ROW. Ciò significa che quando stiamo calcolando la somma, dalla riga iniziale alla riga corrente per ogni riga.Ma se vediamo righe con stipendio 5000 e nome = “Pavan”, idealmente dovrebbe essere 17000 e per stipendio = 5000 e name = Mark, dovrebbe essere 22000. Ma poiché stiamo usando RANGE e in questo caso, se trova elementi simili quindi li considera come lo stesso gruppo logico ed esegue un’operazione su di essi e assegna un valore a ciascun elemento in quel gruppo. Questo è il motivo per cui abbiamo lo stesso valore per stipendio = 5000. Il motore è salito a stipendio = 5000 e Nome = Ron e somma calcolata e quindi lo ha assegnato a tutto lo stipendio = 5000.

Quindi con RIGHE TRA RIGA PRECEDENTE E CORRENTE La differenza è per gli stessi elementi di valore invece di raggruppandoli insieme, calcola la SOMMA dalla riga iniziale alla riga corrente e non tratta gli elementi con lo stesso valore in modo diverso come RANGE

Questi risultati sono gli stessi di

Questo perché Over (ordine per stipendio) è solo una scorciatoia di Over (ordine per stipendio RANGE TRA UNBOUNDED PRECEDING E CURRENT ROW) Quindi, ovunque specifichiamo semplicemente Order by senza ROWS o RANGE sta prendendo RANGE TRA UNBOUNDED PRECEDING E CURRENT ROW come impostazione predefinita.

Nota: questo è applicabile solo alle funzioni che effettivamente accettano RANGE / ROW. Ad esempio, ROW_NUMBER e pochi altri non accettano RANGE / ROW e in tal caso , questo non entra in gioco.

Finora abbiamo visto che la clausola Over con un ordine per sta prendendo Range / ROWS e la sintassi sembra qualcosa hing in questo modo RANGE TRA UNBOUNDED PRECEDING ROW E CURRENT ROWE in realtà sta calcolando fino alla riga corrente dalla prima riga. Ma cosa succede se vuole calcolare i valori per l’intera partizione di dati e averli per ogni colonna (cioè dalla prima riga all’ultima riga). Ecco la query per questo

Invece di CURRENT ROW, sto specificando UNBOUNDED FOLLOWING che istruisce il motore a calcolare fino all’ultimo record di partizione per ogni riga.

Ora arrivo al tuo puntare su cosa è OVER () con le parentesi graffe vuote?

È solo una scorciatoia per Over (ordina per stipendio RIGHE TRA UNBOUNDED PRECEDING E UNBOUNDED FOLLOWING)

Qui stiamo specificando indirettamente per trattare tutto il mio gruppo di risultati come una singola partizione e quindi eseguire i calcoli dal primo record all’ultimo record di ogni partizione.

Ho creato un video su questo e se sei interessato puoi visitarlo. https://www.youtube.com/watch?v=CvVenuVUqto&t=1177s

Grazie, Pavan Kumar AryasomayajuluHTTP: //xyzcoder.github.io

Write a Comment

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *