Tipi di Funzioni Finestra
Scorri per mostrare il menu
Esplorazione sintetica delle principali tipologie di funzioni finestra utilizzate in SQL.
Funzioni di aggregazione
Funzioni di aggregazione standard (AVG, SUM, MAX, MIN, COUNT) utilizzate in un contesto di finestra. Questo tipo di funzione finestra è già stato utilizzato nel capitolo precedente.
Funzioni di ranking
Le funzioni di ranking in SQL sono una tipologia di funzione finestra che consente di assegnare un rango a ciascuna riga all'interno di una partizione di un set di risultati. Queste funzioni sono particolarmente utili per eseguire calcoli ordinati e analisi.
-
RANK(): assegna un rango univoco a ciascuna riga distinta all'interno della partizione in base alla clausolaORDER BY. Le righe con valori uguali ricevono lo stesso rango, lasciando dei vuoti nella sequenza; -
DENSE_RANK(): simile a RANK(), ma senza vuoti nella sequenza di ranking; -
NTILE(n): suddivide le righe in una partizione ordinata inngruppi e assegna un numero di gruppo a ciascuna riga.
Esempio
Classificazione delle vendite in base all'Amount per ciascun ProductID in ordine crescente utilizzando la funzione DENSE_RANK():
12345678SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
La tabella risultante contiene tutte le informazioni della tabella principale e una colonna aggiuntiva che fornisce il rango di ciascuna vendita per il prodotto specifico.
Funzioni di confronto valori
Le funzioni finestra di confronto valori in SQL vengono utilizzate per confrontare i valori della riga corrente con i valori di altre righe all'interno della stessa partizione.
Queste funzioni sono particolarmente utili per analizzare tendenze, eseguire calcoli basati su righe adiacenti o accedere a valori specifici di riga all'interno di una finestra definita.
Sono disponibili diverse funzioni di confronto valori in SQL:
LAG(): recupera il valore da una riga precedente nel set di risultati senza la necessità di un self-join;LEAD(): recupera il valore da una riga successiva nel set di risultati senza la necessità di un self-join;FIRST_VALUE(): restituisce il valore della prima riga nella finestra;LAST_VALUE(): restituisce il valore dell'ultima riga nella finestra.
Esempio
Utilizzo della funzione finestra di confronto valori LAG() per calcolare la variazione dell'importo delle vendite rispetto alla vendita precedente per ciascun prodotto:
1234567891011SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (PARTITION BY product_id ORDER BY sales_date) AS amount_change FROM Sales ORDER BY product_id, sales_date;
Parti principali della query:
- Clausola
SELECT: Specifica le colonne da recuperare dalla tabella.- Nomi delle colonne: Include colonne come
SalesID,ProductID,SalesDateeAmountper visualizzare i dati rilevanti di ogni vendita. - Funzione finestra: Utilizza la funzione
LAG()per recuperare il valore della riga precedente per una colonna specifica all'interno di una partizione. Una colonna calcolata aggiuntiva mostra la differenza tra i valori attuali e precedenti.
- Nomi delle colonne: Include colonne come
Sintassi della funzione finestra:
LAG(column_name, offset, default_value) OVER (PARTITION BY partition_column ORDER BY order_column)column_name: La colonna da cui recuperare il valore precedente.offset: Il numero di righe indietro rispetto alla riga corrente da cui recuperare il valore (il valore predefinito è 1).default_value: Il valore da restituire se l'offset supera i limiti della partizione (opzionale).PARTITION BY partition_column: Divide il risultato in partizioni a cui viene applicata la funzione finestra, garantendo che la funzione operi separatamente su ciascuna partizione.ORDER BY order_column: Specifica l'ordinamento delle righe all'interno di ogni partizione, assicurando che la funzione finestra elabori le righe in una sequenza significativa.
Di conseguenza, è possibile estrarre facilmente informazioni sulle differenze di vendita per ciascun prodotto specifico senza utilizzare sottoquery o stored procedure.
È inoltre possibile calcolare le differenze per tutte le vendite senza partizionamento utilizzando la seguente query:
123456789SELECT sales_id, product_id, sales_date, amount, LAG(amount, 1) OVER (ORDER BY sales_date) AS previous_amount, amount - LAG(amount, 1) OVER (ORDER BY sales_date) AS amount_change FROM Sales;
Puoi notare che non abbiamo incluso la clausola PARTITION BY nel blocco OVER. Questo significa che non vogliamo ottenere i valori precedenti solo per un determinato prodotto, ma per tutte le vendite nella tabella.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione