A prima vista sembra che in SQL ci sia già tutto per l’analisi dei dati: GROUP BY, aggregazioni, subquery... Ma questo è solo l’inizio. Benvenuto nel mondo delle funzioni finestra — uno strumento potentissimo che ti permette di lavorare con i dati riga per riga, mantenendo tutto il contesto.
Le funzioni finestra ti permettono di fare calcoli — somma, media, ranking e altro — su una “finestra” di righe, senza comprimere i dati. Questo significa che, a differenza delle classiche funzioni di aggregazione (SUM(), AVG(), COUNT()), ottieni sia il risultato che i dettagli in ogni riga.
Immagina di voler calcolare il reddito cumulativo per ogni ordine. Con GROUP BY perderesti i dettagli dei singoli ordini — rimarrebbe solo la somma. Ma con una funzione finestra puoi aggiungere il risultato direttamente a ogni riga, senza perdere nulla.
Le funzioni finestra sono super comode perché non distruggono i dati: ogni riga resta al suo posto e i risultati dei calcoli vengono semplicemente aggiunti come nuove colonne. Così puoi fare analisi complesse senza subquery o costrutti pesanti — tutto dentro una sola query. Queste funzioni sono perfette per cose come ranking, calcolo di medie mobili o confronto di valori tra righe. Il codice resta leggibile e il risultato è preciso.
Quando è particolarmente utile:
- Ranking di dipendenti, venditori, prodotti — chi è in che posizione.
- Serie temporali — come sono cambiate le cose giorno per giorno o settimana per settimana.
- Vendite e finanza — quanto si è accumulato a ogni step, quali ordini sono sopra la media, chi è nel top 25%.
Dove si usano le funzioni finestra
In qualsiasi ambito dove conta il contesto, non solo il totale:
- report sulle vendite;
- analisi del comportamento dei clienti;
- costruzione di grafici con metriche cumulative;
- segmentazione dei dati (ad esempio per quartili);
- calcolo di deviazioni e trend.
Sono davvero una manna per chi fa analisi con SQL ogni giorno. Vediamo qualche esempio dal mondo reale dove le funzioni finestra possono salvarti la vita.
Esempio 1: Ranking dei dati
Immagina di avere una lista di studenti con i loro voti d’esame. Vuoi assegnare a ogni studente la sua posizione in classe. Con le funzioni finestra è facilissimo. Ad esempio, le funzioni RANK() o ROW_NUMBER() fanno proprio questo.
Esempio 2: Analisi di dati temporali
E se vuoi vedere come sono cambiati i ricavi dell’azienda mese per mese? Ti serve la somma cumulativa dei ricavi. Usando la funzione finestra SUM() con una finestra definita, ottieni subito il risultato.
Esempio 3: Quartili e suddivisione in gruppi
Vuoi dividere i dati in gruppi uguali (ad esempio per reddito) per segmentare i clienti? Qui ti aiuta la funzione NTILE(). Scopriamo chi sono i clienti nel top 25% e chi è in fondo alla classifica.
Come appare?
Una funzione finestra aggiunge semplicemente il risultato al dataset finale:
SELECT
student_id,
grade,
RANK() OVER (ORDER BY grade DESC) AS rank
FROM
students;
Qui otteniamo una tabella dove ogni studente ha il suo ranking unico in base al voto.
Un’analogia semplice
Immagina di essere a correre con un gruppo di amici. Ognuno va alla sua velocità, ma vuoi sapere che posizione hai nella corsa proprio ora. Invece di fermare tutti e fare una classifica (come fa GROUP BY), semplicemente guardi chi ti sta intorno e capisci il tuo ranking attuale.
Questa è la funzione finestra: non ferma la corsa, non divide tutti in gruppi — aggiunge solo informazioni, mantenendo movimento e dettagli. Ognuno continua a correre, ma ora hai analisi extra — tipo quante persone hai davanti, qual è il tuo ritmo rispetto alla media, ecc.
Vantaggi rispetto ai metodi tradizionali
Vediamo un classico problema: calcolare il ranking dei venditori per ricavi. Ci sono due modi:
Senza funzioni finestra. Devi fare una subquery o anche più di una, prima ordinare i dati, poi numerarli. Non solo è lungo, ma anche difficile da leggere.
Con le funzioni finestra. Basta una query con una sintassi bella pulita e hai già il risultato. Ad esempio:
SELECT
seller_id,
revenue,
RANK() OVER (PARTITION BY region ORDER BY revenue DESC) AS rank_in_region
FROM
sales;
Questa query divide subito i venditori per regione e li numera in ordine decrescente di ricavi.
Esempio reale
Ora immagina di essere un analista e di lavorare sui dati di vendita. Devi sapere:
- ricavi totali per ogni mese,
- come sono cambiati i ricavi rispetto al mese precedente,
- ranking delle regioni per ricavi totali.
Tutto questo si può fare con le funzioni finestra, anche in una sola query. Ma questo lo vediamo nelle prossime lezioni.
Ora che hai le basi sulle funzioni finestra, sei pronto a vedere la loro sintassi e la potenza di ROW_NUMBER(), RANK(), DENSE_RANK() e NTILE(). Passiamo alla prossima lezione!
GO TO FULL VERSION