Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Tipi di Funzioni Finestra | Alcuni Argomenti Aggiuntivi
Ottimizzazione SQL e Funzionalità delle Query

bookTipi di Funzioni Finestra

Esploriamo brevemente i principali tipi di funzioni finestra utilizzate in SQL.

Funzioni di aggregazione

Queste sono le classiche funzioni di aggregazione (AVG, SUM, MAX, MIN, COUNT) utilizzate in un contesto finestra. Abbiamo già utilizzato questo tipo di funzione finestra nel capitolo precedente.

Funzioni di ranking

Le funzioni di ranking in SQL sono un tipo 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 estremamente utili per eseguire calcoli ordinati e analisi.

  • RANK(): assegna un rango univoco a ciascuna riga distinta all'interno della partizione in base alla clausola ORDER 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): divide le righe in una partizione ordinata in n gruppi e assegna un numero di gruppo a ciascuna riga.

Esempio

Classifichiamo le vendite in base all'Amount per ogni ProductID in ordine crescente utilizzando la funzione DENSE_RANK():

12345678
SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
copy

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 attività che prevedono l'analisi di trend, il calcolo basato su righe adiacenti o l'accesso a valori specifici di riga all'interno di una finestra definita. Esistono diverse funzioni di confronto valori in SQL:

  • LAG() : recupera il valore dalla riga precedente nel set di risultati senza la necessità di un self-join;
  • LEAD(): recupera il valore dalla riga successiva nel set di risultati senza la necessità di un self-join;
  • FIRST_VALUE(): restituisce il valore della prima riga nel frame della finestra;
  • LAST_VALUE(): restituisce il valore dell'ultima riga nel frame della finestra.

Esempio

Utilizziamo la funzione finestra di confronto valori LAG() per calcolare la variazione dell'importo delle vendite rispetto alla vendita precedente per ciascun prodotto:

1234567891011
SELECT 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;
copy

Di conseguenza, è possibile estrarre facilmente informazioni sulle differenze di vendita per ciascun prodotto specifico senza utilizzare sottoquery o procedure memorizzate.
È inoltre possibile calcolare le differenze per tutte le vendite senza partizionamento utilizzando la seguente query:

123456789
SELECT 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;
copy

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 presenti nella tabella.

question mark

Cosa fa la funzione NTILE() in SQL?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Suggested prompts:

Can you explain the difference between RANK() and DENSE_RANK() in more detail?

What are some practical use cases for value comparison window functions like LAG() and LEAD()?

Could you provide more examples of window functions in SQL?

bookTipi di Funzioni Finestra

Scorri per mostrare il menu

Esploriamo brevemente i principali tipi di funzioni finestra utilizzate in SQL.

Funzioni di aggregazione

Queste sono le classiche funzioni di aggregazione (AVG, SUM, MAX, MIN, COUNT) utilizzate in un contesto finestra. Abbiamo già utilizzato questo tipo di funzione finestra nel capitolo precedente.

Funzioni di ranking

Le funzioni di ranking in SQL sono un tipo 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 estremamente utili per eseguire calcoli ordinati e analisi.

  • RANK(): assegna un rango univoco a ciascuna riga distinta all'interno della partizione in base alla clausola ORDER 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): divide le righe in una partizione ordinata in n gruppi e assegna un numero di gruppo a ciascuna riga.

Esempio

Classifichiamo le vendite in base all'Amount per ogni ProductID in ordine crescente utilizzando la funzione DENSE_RANK():

12345678
SELECT sales_id, product_id, sales_date, amount, DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_rank_amount FROM Sales;
copy

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 attività che prevedono l'analisi di trend, il calcolo basato su righe adiacenti o l'accesso a valori specifici di riga all'interno di una finestra definita. Esistono diverse funzioni di confronto valori in SQL:

  • LAG() : recupera il valore dalla riga precedente nel set di risultati senza la necessità di un self-join;
  • LEAD(): recupera il valore dalla riga successiva nel set di risultati senza la necessità di un self-join;
  • FIRST_VALUE(): restituisce il valore della prima riga nel frame della finestra;
  • LAST_VALUE(): restituisce il valore dell'ultima riga nel frame della finestra.

Esempio

Utilizziamo la funzione finestra di confronto valori LAG() per calcolare la variazione dell'importo delle vendite rispetto alla vendita precedente per ciascun prodotto:

1234567891011
SELECT 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;
copy

Di conseguenza, è possibile estrarre facilmente informazioni sulle differenze di vendita per ciascun prodotto specifico senza utilizzare sottoquery o procedure memorizzate.
È inoltre possibile calcolare le differenze per tutte le vendite senza partizionamento utilizzando la seguente query:

123456789
SELECT 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;
copy

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 presenti nella tabella.

question mark

Cosa fa la funzione NTILE() in SQL?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 3. Capitolo 3
some-alt