Cursus
En tant que professionnel des données travaillant avec Snowflake, vous aurez peut-être besoin de filtrer les résultats des requêtes en fonction des fonctions des fenêtres. Traditionnellement, cela nécessite des sous-requêtes ou une logique de filtrage complexe. Cependant, Snowflake propose une alternative puissante : la clause QUALIFY
.
Dans ce guide, je vais vous expliquer comment utiliser QUALIFY
pour rationaliser le filtrage, avec des exemples pas à pas et des bonnes pratiques.
Qu'est-ce que la clause QUALIFY dans Snowflake ?
La clause QUALIFY
dans Snowflake est utilisée pour filtrer les résultats avec des fonctions de fenêtre. Vous pouvez définir les fonctions de fenêtre dans la liste SELECT
ou les référencer directement dans la clause QUALIFY
.
En règle générale, WHERE
filtre les lignes brutes avant l'agrégation, tandis que HAVING
filtre après l'agrégation GROUP BY
.
Au lieu de cela, QUALIFY
permet de filtrer les résultats d'instructions SQL telles que ROW_NUMBER()
, RANK()
et DENSE_RANK()
. Cela signifie que nous pouvons l'utiliser dans nos fonctions de fenêtre pour les sorties et les filtrer immédiatement.
Vous pouvez considérer que QUALIFY
fait pour les fonctions de fenêtre ce que HAVING
fait pour les agrégats - filtrer le résultat après qu'il a été calculé.
Il existe plusieurs cas d'utilisation où la clause QUALIFY
s'avère particulièrement utile :
- Vous devez filtrer les résultats de la requête sur la base des sorties de la fonction de fenêtre.
- Vous souhaitez simplifier vos requêtes SQL en réduisant le nombre de sous-requêtes.
- Vous devez classer, dédupliquer ou segmenter efficacement les données au sein des partitions.
- Vous préparez un rapport ou un tableau de bord qui requiert les enregistrements les plus performants par catégorie.
> Si vous ne connaissez pas Snowflake, notre cours Introduction à Snowflake vous offre un point de départ pratique avant de plonger dans des clauses telles que QUALIFY. Vous pouvez également explorer les possibilités plus larges de Snowflake grâce à ce tutoriel destiné aux débutants.
Syntaxe de QUALIFY dans Snowflake
Passons en revue la syntaxe de base de QUALIFY
afin que vous puissiez en comprendre les éléments. Voici à quoi peut ressembler une requête simple utilisant QUALIFY
:
SELECT
column1,
column2,
window_function() OVER (PARTITION BY column3 ORDER BY column4) AS rank
FROM table_name
QUALIFY window_function_condition;
Vous disposez de la clause habituelle SELECT
suivie de quelques colonnes. Vous devez ensuite écrire votre window_function()
dans le format habituel pour obtenir une colonne appelée rank
.
Il y a la déclaration habituelle FROM
, qui nous indique le tableau, et enfin notre QUALIFY
. Cette adresse QUALIFY
est suivie de la "window_function_condition", qui est souvent une égalité et peut ressembler à quelque chose comme QUALIFY rank = 1
Note : Vous pouvez faire référence à l'alias d'une fonction window ou réécrire toute l'expression de la fonction window dans la clause QUALIFY
. Les deux approches fonctionnent.
> Si vous avez besoin de revoir les fonctions des fenêtres, jetez un coup d'œil à cet aide-mémoire sur les fonctions des fenêtres.
Exemples d'utilisation de QUALIFY dans Snowflake
Maintenant que vous connaissez la structure générale de QUALIFY
, je vais vous présenter quelques exemples spécifiques utilisant cette clause.
Exemple 1 : Filtrage des N premières lignes par groupe
Supposons que nous voulions trouver les 3 employés les mieux payés dans chaque département. Voyons d'abord un exemple qui n'utilise pas QUALIFY
, suivi d'une version plus concise qui l'utilise.
/* First we have to rank all the employees */
WITH ranked_employees AS (
SELECT employee_id, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees)
/* Then we query to subquery and filter using WHERE */
SELECT *
FROM ranked_employees
WHERE rank <= 3;
Comme vous pouvez le constater, l'exemple ci-dessus nécessite un CTE, mais avec QUALIFY
, la requête est plus simple :
SELECT employee_id, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank <= 3;
La requête ci-dessus attribue un rang à chaque employé au sein de son département et renvoie les 3 premiers de chaque département. Il utilise l'instruction QUALIFY
pour filtrer immédiatement sans avoir recours à une sous-requête ou à un CTE. Ceci est particulièrement utile dans les tableaux de bord ou les API où il est important de minimiser la longueur des requêtes et le temps de réponse.
Exemple 2 : Filtrage des enregistrements en double
Si un tableau contient des enregistrements en double et que nous voulons conserver uniquement la première occurrence sur la base d'une fonction de classement, nous pouvons utiliser QUALIFY
avec ROW_NUMBER()
:
SELECT
order_id,
customer_id,
order_date,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS row_num
FROM orders
QUALIFY row_num = 1;
La colonne row_num
est générée en partitionnant chaque client et en les triant par date de commande. Cela permet d'attribuer un numéro séquentiel à chaque ordre, en commençant par le plus ancien. En filtrant à l'aide de QUALIFY row_num = 1
, nous nous assurons que seule la première commande de chaque client est conservée.
Cette technique est couramment utilisée dans les tâches de déduplication lors du nettoyage des données.
Exemple 3 : Filtrage basé sur la fonction de fenêtre dans les agrégats
Soyons un peu plus fantaisistes. L'utilisation de QUALIFY
avec des fonctions de fenêtres agrégées permet un filtrage plus souple et plus dynamique.
Par exemple, si nous voulons trouver les employés dont les salaires sont supérieurs à la moyenne du département, nous pouvons utiliser QUALIFY
avec AVG()
sur une fonction de fenêtre :
SELECT
employee_id,
department,
salary,
AVG(salary) OVER (PARTITION BY department) AS avg_salary
FROM employees
QUALIFY salary > avg_salary;
Ce type de logique est très utile pour identifier les valeurs aberrantes ou les personnes les plus performantes au sein d'un groupe de pairs.
> Si vous souhaitez renforcer vos compétences en SQL pour effectuer des requêtes plus complexes comme celles-ci, consultez notre cours SQL intermédiaire.
Meilleures pratiques pour l'utilisation de QUALIFY dans Snowflake
Voici quelques bonnes pratiques et utilisations de la clause QUALIFY
.
Simplifier les requêtes complexes
La puissance de QUALIFY
réside dans sa capacité à simplifier les requêtes en supprimant les sous-requêtes et les CTE supplémentaires. Appuyez-vous sur cette fonctionnalité. Utilisez-la chaque fois que vous écrivez une fonction de fenêtre et que vous avez besoin de filtrer sur la base de son résultat, sans créer de sous-requête.
Moins d'ETC signifie un débogage plus facile, une logique plus claire et une meilleure maintenabilité.
Combinez QUALIFY avec d'autres fonctions de la fenêtre
Vous pouvez combiner plusieurs fonctions de fenêtre pour affiner le filtrage. Par exemple, l'utilisation de ROW_NUMBER()
avec RANK()
pour résoudre les problèmes de classement tout en limitant les résultats :
SELECT
employee_id,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank,
ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC, employee_id) AS row_num
FROM employees
QUALIFY rank <= 3 AND row_num <= 3;
Cette requête renvoie les salariés qui se situent dans les 3 premiers rangs salariaux de leur département. Toutefois, si plus de trois employés sont à égalité dans ce top 3, seuls les trois premiers seront affichés, classés par numéro d'identification de l'employé.
Considérations sur les performances
Bien que QUALIFY
simplifie les requêtes en termes de code écrit, certains aspects liés à la performance doivent être pris en compte.
Les fonctions de fenêtre peuvent être coûteuses en termes de calcul et les requêtes mal structurées peuvent devenir gourmandes en ressources. Veillez à garder ces concepts à l'esprit :
- Les fonctions de fenêtre peuvent s'avérer coûteuses en termes de calcul pour les grands ensembles de données, il convient donc de faire preuve de prudence quant à l'étape du processus à laquelle vous les utilisez.
- Veillez à ce que l'indexation et le partitionnement soient corrects afin d'optimiser les performances.
- Utilisez
LIMIT
en conjonction avecQUALIFY
pour améliorer encore l'efficacité des tests. - Utilisez l 'outil Query Profile de Snowflake pour identifier les goulets d'étranglement des performances dans les requêtes fenêtrées.
Dépannage des requêtes QUALIFY
Il peut être facile de tomber dans des pièges avec les déclarations QUALIFY
, étant donné la complexité des fonctions des fenêtres. Voici quelques conseils pour vous aider à résoudre les problèmes les plus courants que vous pourriez rencontrer.
1. Utilisation des fonctions de fenêtre dans la clause WHERE
Si vous tentez d'utiliser des fonctions de fenêtre directement dans la clause WHERE
, des erreurs se produiront car WHERE
est évalué avant que les fonctions de fenêtre ne soient traitées.
-- This will cause an error
SELECT employee_id, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
WHERE rank = 1;
Solution : Utilisez plutôt la clause QUALIFY
, qui est évaluée après les fonctions de fenêtre.
SELECT employee_id, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;
2. Omettre le prédicat dans QUALIFY
La clause QUALIFY
requiert un prédicat pour filtrer les résultats des fonctions de la fenêtre. L'omission du prédicat entraînera des erreurs.
-- This will cause an error
SELECT employee_id, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY RANK() OVER (PARTITION BY department ORDER BY salary DESC);
Solution : Veillez à ce que la clause QUALIFY
comprenne un prédicat, tel que = 1
, pour filtrer la ligne la mieux classée.
SELECT employee_id, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;
3. Alias ambigus
L'utilisation du même alias pour une colonne et une fonction de fenêtre peut entraîner des confusions et des résultats inattendus.
-- Potentially ambiguous
SELECT salary AS rank,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;
Solution : Utilisez des alias distincts pour éviter toute ambiguïté.
SELECT salary AS salary_amount,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS salary_rank
FROM employees
QUALIFY salary_rank = 1;
4. Partitionnement ou ordonnancement incorrect
La spécification incorrecte des clauses PARTITION BY
ou ORDER BY
dans les fonctions de fenêtre peut entraîner des résultats inattendus.
Solution : Définissez avec soin le partitionnement et l'ordonnancement pour qu'ils correspondent à la logique souhaitée. Par exemple, pour obtenir le salaire le plus élevé par département :
SELECT employee_id, department, salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees
QUALIFY rank = 1;
Conclusion
La clause QUALIFY
de Snowflake est un outil puissant pour filtrer les résultats sur la base des fonctions de fenêtre, ce qui réduit le besoin de sous-requêtes et rend les requêtes plus lisibles. En comprenant comment l'utiliser efficacement, les scientifiques des données peuvent simplifier leurs requêtes et améliorer leur efficacité lorsqu'ils travaillent avec des données classées, groupées ou agrégées.
Prêt à approfondir vos compétences en matière de Snowflake et de SQL ? Commencez par notre cours Introduction à Snowflake, affinez vos requêtes analytiques dans le cours PostgreSQL window functions, ou faites avancer votre carrière avec le parcours Associate Data Engineer in SQL!
FAQ
Quelle est la différence entre QUALIFIER et OÙ et AVOIR ?
WHERE
filtre les données brutes avant de les agréger.HAVING
filtre les données agrégées aprèsGROUP BY
.QUALIFY
filtre les résultats après l'application des fonctions de fenêtre.
La méthode QUALIFY améliore-t-elle les performances des requêtes ?
QUALIFY
peut simplifier les requêtes et réduire le nombre de sous-requêtes, mais les performances dépendent de la taille des données et de l'indexation. Un partitionnement adéquat peut contribuer à optimiser les performances.
Puis-je utiliser QUALIFY avec des fonctions de fenêtre sans classement comme SUM() ou AVG() ?
Oui, mais veillez à ce que la condition de filtrage ait un sens. Par exemple, le filtrage des employés dont les salaires sont supérieurs à la moyenne fonctionne parce que AVG()
peut être calculé par partition.
Puis-je utiliser plusieurs fonctions de fenêtres avec QUALIFY ?
Oui. Vous pouvez combiner plusieurs fonctions de fenêtre dans une seule requête et utiliser des conditions logiques dans QUALIFY
pour filtrer sur la base d'une ou plusieurs d'entre elles.
Quand ne dois-je pas utiliser QUALIFY dans Snowflake ?
Évitez QUALIFY
si votre logique ne repose pas sur des fonctions de fenêtre ou si elle rend la requête plus difficile à déboguer en raison d'une logique complexe imbriquée.
Est-ce que QUALIFY supporte toutes les fonctions des fenêtres dans Snowflake ?
Oui. Les fonctions telles que ROW_NUMBER()
, RANK()
, DENSE_RANK()
, NTILE()
, et les fonctions agrégées avec OVER()
peuvent toutes être filtrées à l'aide de QUALIFY
.
La méthode QUALIFY est-elle spécifique à Snowflake ?
Bien que QUALIFY
soit pris en charge par Snowflake et quelques autres plateformes comme BigQuery, il ne fait pas partie de la norme ANSI SQL, de sorte que la portabilité peut poser problème.
Puis-je imbriquer QUALIFY dans des CTE ou des sous-requêtes ?
Oui, QUALIFY
peut être utilisé à l'intérieur d'expressions de tableau communes (CTE) ou de sous-requêtes, ce qui offre une grande souplesse pour la conception modulaire de SQL.
Comment déboguer les erreurs liées à QUALIFY dans Snowflake ?
Commencez par vérifier les conflits d'alias, assurez-vous que toutes les fonctions de fenêtre sont correctement définies et utilisez le profil de requête de Snowflake pour résoudre les problèmes de performance ou de logique.
Je suis un data scientist avec de l'expérience dans l'analyse spatiale, l'apprentissage automatique et les pipelines de données. J'ai travaillé avec GCP, Hadoop, Hive, Snowflake, Airflow et d'autres processus d'ingénierie et de science des données.