Snowflake QUALIFY per principianti: cos’è e come usarlo
Questa guida fa chiarezza sulla clausola QUALIFY di Snowflake, mostrandoti come semplificare le query SQL filtrando le funzioni finestra senza sottoquery: perfetta per analisi più pulite e veloci.
Se lavori con Snowflake come data professional, potresti dover filtrare i risultati delle query in base a funzioni finestra. Tradizionalmente, questo richiede sottoquery o logiche di filtro complesse. Tuttavia, Snowflake offre un’alternativa potente: la clausola QUALIFY.
In questa guida ti mostrerò come usare QUALIFY per semplificare i filtri, con esempi passo passo e buone pratiche.
Che cos’è la clausola QUALIFY in Snowflake?
La clausola QUALIFY in Snowflake serve a filtrare i risultati con le funzioni finestra. Puoi definire le funzioni finestra sia nella lista SELECT sia richiamarle direttamente nella clausola QUALIFY.
In genere, WHERE filtra le righe grezze prima dell’aggregazione, mentre HAVING filtra dopo un’aggregazione GROUP BY.
Invece, QUALIFY consente di filtrare sui risultati di istruzioni SQL come ROW_NUMBER(), RANK() e DENSE_RANK(). Questo significa che possiamo usarla nelle nostre funzioni finestra per produrre output e filtrarli subito.
Puoi pensare a QUALIFY come a ciò che HAVING fa per gli aggregati: filtra il risultato dopo che è stato calcolato.
Ci sono diversi casi d’uso in cui la clausola QUALIFY è particolarmente utile:
Devi filtrare i risultati di una query in base all’output delle funzioni finestra.
Vuoi semplificare le query SQL riducendo la necessità di sottoquery.
Devi classificare, deduplicare o segmentare i dati in modo efficiente all’interno di partizioni.
Stai preparando un report o una dashboard che richiede i record con le migliori performance per categoria.
> Se sei agli inizi con Snowflake, il nostro corso Introduction to Snowflake offre un punto di partenza pratico prima di immergerti in clausole come QUALIFY. Puoi anche esplorare le funzionalità più ampie di Snowflake con questo tutorial per principianti.
Sintassi di QUALIFY in Snowflake
Rivediamo la sintassi di base di QUALIFY per comprenderne le parti. Ecco come potrebbe apparire una semplice query che usa QUALIFY:
SELECT
column1,
column2,
window_function()OVER(PARTITIONBY column3 ORDERBY column4)AS rank
FROM table_name
QUALIFY window_function_condition;Offerto da
Hai la solita clausola SELECT seguita da alcune colonne. Poi la tua window_function() nella forma abituale per ottenere una colonna chiamata rank.
C’è la consueta istruzione FROM, che indica la tabella, e infine la nostra QUALIFY. Questa QUALIFY è seguita dalla “window_function_condition”, spesso un’uguaglianza, ad esempio QUALIFY rank = 1
Nota: puoi fare riferimento all’alias di una funzione finestra oppure riscrivere l’intera espressione della funzione finestra all’interno della clausola QUALIFY. Entrambi gli approcci funzionano.
Ora che conosci la struttura generale di QUALIFY, ti mostrerò alcuni esempi specifici che usano questa clausola.
Esempio 1: filtrare le prime N righe per gruppo
Supponiamo di voler trovare i 3 dipendenti più pagati in ogni reparto. Per prima cosa, vediamo un esempio che non usa QUALIFY, seguito da una versione più concisa che lo usa.
/* First we have to rank all the employees */WITH ranked_employees AS(SELECT employee_id, department, salary,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS rank
FROM employees)/* Then we query to subquery and filter using WHERE */SELECT*FROM ranked_employees
WHERE rank <=3;Offerto da
Come vedi, l’esempio sopra richiede una CTE, ma con QUALIFY la query è più lineare:
SELECT employee_id, department, salary,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS rank
FROM employees
QUALIFY rank <=3;Offerto da
La query sopra assegna un rango a ciascun dipendente all’interno del proprio reparto e restituisce i primi 3 per reparto. Usa l’istruzione QUALIFY per filtrare immediatamente senza bisogno di una sottoquery o di una CTE. Questo è particolarmente utile in dashboard o API dove è importante ridurre la lunghezza della query e i tempi di risposta.
Esempio 2: filtrare i record duplicati
Se una tabella ha record duplicati e vogliamo mantenere solo la prima occorrenza in base a una funzione di ranking, possiamo usare QUALIFY con ROW_NUMBER():
SELECT
order_id,
customer_id,
order_date,
ROW_NUMBER()OVER(PARTITIONBY customer_id ORDERBY order_date)AS row_num
FROM orders
QUALIFY row_num =1;Offerto da
La colonna row_num viene generata partizionando per ciascun cliente e ordinando per data dell’ordine. Assegna un numero sequenziale a ogni ordine, partendo dal più antico. Filtrando con QUALIFY row_num = 1, ci assicuriamo di mantenere solo l’ordine più vecchio per ciascun cliente.
Questa tecnica è comunemente usata nelle attività di deduplicazione durante il data cleaning.
Esempio 3: filtrare basandosi su funzioni finestra in aggregazioni
Alziamo un po’ l’asticella. Usare QUALIFY con funzioni finestra aggregate consente filtri più flessibili e dinamici.
Per esempio, se vogliamo trovare i dipendenti con stipendi superiori alla media del reparto, possiamo usare QUALIFY con AVG() su una funzione finestra:
SELECT
employee_id,
department,
salary,AVG(salary)OVER(PARTITIONBY department)AS avg_salary
FROM employees
QUALIFY salary > avg_salary;Offerto da
Questo tipo di logica è ottimo per identificare outlier o top performer all’interno di gruppi omogenei.
> Se vuoi rafforzare le tue skill SQL per query più complesse come queste, dai un’occhiata al nostro corso Intermediate SQL.
Best practice per usare QUALIFY in Snowflake
Ecco alcune buone pratiche e utilizzi per una clausola QUALIFY.
Semplifica le query complesse
La forza di QUALIFY sta nella sua capacità di semplificare le query eliminando la necessità di sottoquery e CTE aggiuntive. Sfrutta questa funzionalità. Usala ogni volta che scrivi una funzione finestra e hai bisogno di filtrare in base al suo output, senza creare una sottoquery.
Meno CTE significa debugging più semplice, logica più chiara e migliore manutenibilità.
Combina QUALIFY con altre funzioni finestra
Puoi combinare più funzioni finestra per ottenere filtri più raffinati. Per esempio, usare ROW_NUMBER() insieme a RANK() per risolvere i pari merito limitando al contempo i risultati:
SELECT
employee_id,
department,
salary,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS rank,
ROW_NUMBER()OVER(PARTITIONBY department ORDERBY salary DESC, employee_id)AS row_num
FROM employees
QUALIFY rank <=3AND row_num <=3;Offerto da
Questa query restituisce i dipendenti che rientrano nei primi 3 ranghi di stipendio del loro reparto. Tuttavia, se più di tre dipendenti sono a pari merito entro quei primi 3, mostrerà solo i primi tre ordinati per ID dipendente.
Considerazioni sulle performance
Sebbene QUALIFY semplifichi le query in termini di codice scritto, ci sono alcuni aspetti prestazionali da considerare.
Le funzioni finestra possono essere costose dal punto di vista computazionale e query strutturate male possono diventare onerose in termini di risorse. Tieni a mente questi concetti:
Le funzioni finestra possono essere costose su dataset di grandi dimensioni, quindi fai attenzione a in quale fase del processo le utilizzi.
Assicurati un partizionamento adeguato per ottimizzare le performance.
Usa LIMIT insieme a QUALIFY per una maggiore efficienza durante i test.
Con le istruzioni QUALIFY è facile incappare in insidie, data la complessità delle funzioni finestra. Ecco alcuni suggerimenti per i problemi più comuni.
1. Usare funzioni finestra nella clausola WHERE
Provare a usare funzioni finestra direttamente nella clausola WHERE genererà errori perché WHERE viene valutata prima che le funzioni finestra vengano elaborate.
-- This will cause an errorSELECT employee_id, department, salary,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS rank
FROM employees
WHERE rank =1;Offerto da
Soluzione: usa invece la clausola QUALIFY, che è valutata dopo le funzioni finestra.
SELECT employee_id, department, salary,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS rank
FROM employees
QUALIFY rank =1;Offerto da
2. Omettere il predicato in QUALIFY
La clausola QUALIFY richiede un predicato per filtrare i risultati delle funzioni finestra. Ometterlo porterà a errori.
-- This will cause an errorSELECT employee_id, department, salary,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS rank
FROM employees
QUALIFY RANK()OVER(PARTITIONBY department ORDERBY salary DESC);Offerto da
Soluzione: assicurati che la clausola QUALIFY includa un predicato, come = 1 per filtrare la riga con il rango più alto.
SELECT employee_id, department, salary,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS rank
FROM employees
QUALIFY rank =1;Offerto da
3. Alias ambigui
Usare lo stesso alias per una colonna e per una funzione finestra può creare confusione e risultati inattesi.
-- Potentially ambiguousSELECT salary AS rank,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS rank
FROM employees
QUALIFY rank =1;Offerto da
Soluzione: usa alias distinti per evitare ambiguità.
SELECT salary AS salary_amount,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS salary_rank
FROM employees
QUALIFY salary_rank =1;Offerto da
4. Partizionamento o ordinamento errati
Specificare in modo errato le clausole PARTITION BY o ORDER BY nelle funzioni finestra può portare a risultati imprevisti.
Soluzione: definisci con attenzione partizionamento e ordinamento in base alla logica desiderata. Per esempio, per ottenere lo stipendio più alto per reparto:
SELECT employee_id, department, salary,
RANK()OVER(PARTITIONBY department ORDERBY salary DESC)AS rank
FROM employees
QUALIFY rank =1;Offerto da
Conclusione
La clausola QUALIFY in Snowflake è uno strumento potente per filtrare i risultati basandosi su funzioni finestra, riducendo la necessità di sottoquery e rendendo le query più leggibili. Capendo come usarla in modo efficace, i data scientist possono semplificare le proprie query e migliorare l’efficienza quando lavorano con dati classificati, raggruppati o aggregati.
WHERE filtra i dati grezzi prima dell’aggregazione.
HAVING filtra i dati aggregati dopo GROUP BY.
QUALIFY filtra i risultati dopo l’applicazione delle funzioni finestra.
QUALIFY migliora le performance delle query?⌄
QUALIFY può semplificare le query e ridurre la necessità di sottoquery, ma le performance dipendono da dimensione dei dati e partizionamento. Un partizionamento adeguato può aiutare a ottimizzare le performance.
Posso usare QUALIFY con funzioni finestra non di ranking come SUM() o AVG()?⌄
Sì, ma assicurati che la condizione di filtro abbia senso. Per esempio, filtrare i dipendenti con stipendi sopra la media funziona perché AVG() può essere calcolata per partizione.
Posso usare più funzioni finestra con QUALIFY?⌄
Sì. Puoi combinare diverse funzioni finestra in una singola query e usare condizioni logiche in QUALIFY per filtrare in base a una o più di esse.
Quando non dovrei usare QUALIFY in Snowflake?⌄
Evita QUALIFY se la tua logica non si basa su funzioni finestra o se rende la query più difficile da fare debug a causa di logiche annidate complesse.
QUALIFY supporta tutte le funzioni finestra in Snowflake?⌄
Sì. Funzioni come ROW_NUMBER(), RANK(), DENSE_RANK(), NTILE() e le funzioni di aggregazione con OVER() possono tutte essere filtrate usando QUALIFY.
QUALIFY è specifica di Snowflake?⌄
Sebbene QUALIFY sia supportata in Snowflake e in alcune altre piattaforme come BigQuery, non fa parte dello standard ANSI SQL, quindi la portabilità può essere un problema.
Posso annidare QUALIFY dentro CTE o sottoquery?⌄
Sì, QUALIFY può essere usata all’interno di Common Table Expression (CTE) o sottoquery, offrendo flessibilità per un design SQL modulare.
Come faccio il debug degli errori legati a QUALIFY in Snowflake?⌄
Inizia controllando conflitti di alias, assicurandoti che tutte le funzioni finestra siano definite correttamente e usando il Query Profile di Snowflake per risolvere problemi di performance o di logica.
Sono una data scientist con esperienza in analisi spaziale, machine learning e pipeline dei dati. Ho lavorato con GCP, Hadoop, Hive, Snowflake, Airflow e altri processi di data science/engineering.
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Snowflake è una piattaforma leader per il data warehousing. Scopri come usare Snowsight, un'interfaccia SQL intuitiva per accedere ed esplorare i dati.
Impara a progettare, interrogare e costruire in Snowflake: diventa un esperto di Snowflake SQL per la trasformazione e la modellazione e preparati a diventare un Data Engineer pronto per il mondo del lavoro.
Se lavori con Snowflake come data professional, potresti dover filtrare i risultati delle query in base a funzioni finestra. Tradizionalmente, questo richiede sottoquery o logiche di filtro complesse. Tuttavia, Snowflake offre un’alternativa potente: la clausola
QUALIFY.In questa guida ti mostrerò come usare
QUALIFYper semplificare i filtri, con esempi passo passo e buone pratiche.Che cos’è la clausola QUALIFY in Snowflake?
La clausola
QUALIFYin Snowflake serve a filtrare i risultati con le funzioni finestra. Puoi definire le funzioni finestra sia nella listaSELECTsia richiamarle direttamente nella clausolaQUALIFY.In genere,
WHEREfiltra le righe grezze prima dell’aggregazione, mentreHAVINGfiltra dopo un’aggregazioneGROUP BY.Invece,
QUALIFYconsente di filtrare sui risultati di istruzioni SQL comeROW_NUMBER(),RANK()eDENSE_RANK(). Questo significa che possiamo usarla nelle nostre funzioni finestra per produrre output e filtrarli subito.Puoi pensare a
QUALIFYcome a ciò cheHAVINGfa per gli aggregati: filtra il risultato dopo che è stato calcolato.Ci sono diversi casi d’uso in cui la clausola
QUALIFYè particolarmente utile:> Se sei agli inizi con Snowflake, il nostro corso Introduction to Snowflake offre un punto di partenza pratico prima di immergerti in clausole come QUALIFY. Puoi anche esplorare le funzionalità più ampie di Snowflake con questo tutorial per principianti.
Sintassi di QUALIFY in Snowflake
Rivediamo la sintassi di base di
QUALIFYper comprenderne le parti. Ecco come potrebbe apparire una semplice query che usaQUALIFY:Hai la solita clausola
SELECTseguita da alcune colonne. Poi la tuawindow_function()nella forma abituale per ottenere una colonna chiamatarank.C’è la consueta istruzione
FROM, che indica la tabella, e infine la nostraQUALIFY. QuestaQUALIFYè seguita dalla “window_function_condition”, spesso un’uguaglianza, ad esempioQUALIFY rank = 1Nota: puoi fare riferimento all’alias di una funzione finestra oppure riscrivere l’intera espressione della funzione finestra all’interno della clausola
QUALIFY. Entrambi gli approcci funzionano.> Se ti serve un ripasso delle funzioni finestra, dai un’occhiata a questo cheat sheet sulle funzioni finestra.
Esempi di utilizzo di QUALIFY in Snowflake
Ora che conosci la struttura generale di
QUALIFY, ti mostrerò alcuni esempi specifici che usano questa clausola.Esempio 1: filtrare le prime N righe per gruppo
Supponiamo di voler trovare i 3 dipendenti più pagati in ogni reparto. Per prima cosa, vediamo un esempio che non usa
QUALIFY, seguito da una versione più concisa che lo usa.Come vedi, l’esempio sopra richiede una CTE, ma con
QUALIFYla query è più lineare:La query sopra assegna un rango a ciascun dipendente all’interno del proprio reparto e restituisce i primi 3 per reparto. Usa l’istruzione
QUALIFYper filtrare immediatamente senza bisogno di una sottoquery o di una CTE. Questo è particolarmente utile in dashboard o API dove è importante ridurre la lunghezza della query e i tempi di risposta.Esempio 2: filtrare i record duplicati
Se una tabella ha record duplicati e vogliamo mantenere solo la prima occorrenza in base a una funzione di ranking, possiamo usare
QUALIFYconROW_NUMBER():La colonna
row_numviene generata partizionando per ciascun cliente e ordinando per data dell’ordine. Assegna un numero sequenziale a ogni ordine, partendo dal più antico. Filtrando conQUALIFY row_num = 1, ci assicuriamo di mantenere solo l’ordine più vecchio per ciascun cliente.Questa tecnica è comunemente usata nelle attività di deduplicazione durante il data cleaning.
Esempio 3: filtrare basandosi su funzioni finestra in aggregazioni
Alziamo un po’ l’asticella. Usare
QUALIFYcon funzioni finestra aggregate consente filtri più flessibili e dinamici.Per esempio, se vogliamo trovare i dipendenti con stipendi superiori alla media del reparto, possiamo usare
QUALIFYconAVG()su una funzione finestra:Questo tipo di logica è ottimo per identificare outlier o top performer all’interno di gruppi omogenei.
> Se vuoi rafforzare le tue skill SQL per query più complesse come queste, dai un’occhiata al nostro corso Intermediate SQL.
Best practice per usare QUALIFY in Snowflake
Ecco alcune buone pratiche e utilizzi per una clausola
QUALIFY.Semplifica le query complesse
La forza di
QUALIFYsta nella sua capacità di semplificare le query eliminando la necessità di sottoquery e CTE aggiuntive. Sfrutta questa funzionalità. Usala ogni volta che scrivi una funzione finestra e hai bisogno di filtrare in base al suo output, senza creare una sottoquery.Meno CTE significa debugging più semplice, logica più chiara e migliore manutenibilità.
Combina QUALIFY con altre funzioni finestra
Puoi combinare più funzioni finestra per ottenere filtri più raffinati. Per esempio, usare
ROW_NUMBER()insieme aRANK()per risolvere i pari merito limitando al contempo i risultati:Questa query restituisce i dipendenti che rientrano nei primi 3 ranghi di stipendio del loro reparto. Tuttavia, se più di tre dipendenti sono a pari merito entro quei primi 3, mostrerà solo i primi tre ordinati per ID dipendente.
Considerazioni sulle performance
Sebbene
QUALIFYsemplifichi le query in termini di codice scritto, ci sono alcuni aspetti prestazionali da considerare.Le funzioni finestra possono essere costose dal punto di vista computazionale e query strutturate male possono diventare onerose in termini di risorse. Tieni a mente questi concetti:
LIMITinsieme aQUALIFYper una maggiore efficienza durante i test.Risoluzione dei problemi con query QUALIFY
Con le istruzioni
QUALIFYè facile incappare in insidie, data la complessità delle funzioni finestra. Ecco alcuni suggerimenti per i problemi più comuni.1. Usare funzioni finestra nella clausola WHERE
Provare a usare funzioni finestra direttamente nella clausola
WHEREgenererà errori perchéWHEREviene valutata prima che le funzioni finestra vengano elaborate.Soluzione: usa invece la clausola
QUALIFY, che è valutata dopo le funzioni finestra.2. Omettere il predicato in QUALIFY
La clausola
QUALIFYrichiede un predicato per filtrare i risultati delle funzioni finestra. Ometterlo porterà a errori.Soluzione: assicurati che la clausola
QUALIFYincluda un predicato, come= 1per filtrare la riga con il rango più alto.3. Alias ambigui
Usare lo stesso alias per una colonna e per una funzione finestra può creare confusione e risultati inattesi.
Soluzione: usa alias distinti per evitare ambiguità.
4. Partizionamento o ordinamento errati
Specificare in modo errato le clausole
PARTITION BYoORDER BYnelle funzioni finestra può portare a risultati imprevisti.Soluzione: definisci con attenzione partizionamento e ordinamento in base alla logica desiderata. Per esempio, per ottenere lo stipendio più alto per reparto:
Conclusione
La clausola
QUALIFYin Snowflake è uno strumento potente per filtrare i risultati basandosi su funzioni finestra, riducendo la necessità di sottoquery e rendendo le query più leggibili. Capendo come usarla in modo efficace, i data scientist possono semplificare le proprie query e migliorare l’efficienza quando lavorano con dati classificati, raggruppati o aggregati.Pronto a fare un salto di qualità con le tue skill su Snowflake e SQL? Inizia con il nostro corso Introduction to Snowflake, affina le tue query analitiche nel corso PostgreSQL sulle funzioni finestra o fai avanzare la tua carriera con il percorso Associate Data Engineer in SQL!