La clause QUALIFY filtre les résultats des fonctions de fenêtrage, tout comme HAVING le fait pour les fonctions d'agrégation.
Évaluée après le calcul de toutes les fonctions de fenêtrage, QUALIFY évite de recourir à une sous-requête ou à une clause WITH pour filtrer sur le résultat d'une fonction de fenêtrage.
Les clauses d'une instruction SELECT s'exécutent dans l'ordre suivant :
FROM
WHERE
GROUP BY
HAVING
WINDOW
QUALIFY
DISTINCT
ORDER BY
LIMIT
Syntaxe
QUALIFY <predicate>
Forme complète de l'instruction :
SELECT <column_list>
FROM <data_source>
[GROUP BY ...]
[HAVING ...]
QUALIFY <predicate>
[ ... ]
Paramètres
|
Paramètre |
Description |
|
column_list |
Suit les règles applicables à la clause de projection d'une instruction |
|
data_source |
Table ou autre source assimilable, telle qu'une vue. |
|
predicate |
Expression filtrant les résultats après le calcul des fonctions d'agrégation et de fenêtrage. Sa structure est identique à celle d'une clause |
Remarques d'utilisation
QUALIFYexige au moins une fonction de fenêtrage dans l'un des emplacements suivants :column_listoupredicate.Vous pouvez référencer les expressions de la
column_list, y compris les fonctions de fenêtrage, par leurs alias de colonne.QUALIFYprend en charge les agrégations et les sous-requêtes dans sonpredicate. Les règles d'agrégation sont identiques à celles deHAVING.QUALIFYest un mot-clé réservé.La syntaxe Snowflake de
QUALIFYne fait pas partie de la norme ANSI.
Exemples
Les exemples ci-dessous utilisent la fonction de fenêtrage ROW_NUMBER() pour retourner uniquement la première ligne de chaque partition.
Créez d'abord la table d'exemple :
CREATE TABLE qt (i INTEGER, p TEXT, o INTEGER);
INSERT INTO qt (i, p, o) VALUES
(1, 'A', 1),
(2, 'A', 2),
(3, 'B', 1),
(4, 'B', 2);
-
Sans QUALIFY : sous-requête imbriquée
SELECT * FROM ( SELECT i, p, o, ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num FROM qt ) WHERE row_num = 1;Résultat :
+---+---+---+---------+ | I | P | O | ROW_NUM | |---+---+---+---------| | 1 | A | 1 | 1 | | 3 | B | 1 | 1 | +---+---+---+---------+ -
Avec QUALIFY : fonction de fenêtrage dans le prédicat
Définissez la fonction de fenêtrage directement dans le prédicat
QUALIFY:SELECT i, p, o FROM qt QUALIFY ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) = 1;Résultat :
+---+---+---+ | I | P | O | |---+---+---| | 1 | A | 1 | | 3 | B | 1 | +---+---+---+ -
Avec QUALIFY : alias de colonne dans le prédicat
Définissez la fonction de fenêtrage dans la
column_listet référencez son alias dans le prédicatQUALIFY:SELECT i, p, o, ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num FROM qt QUALIFY row_num = 1;Résultat :
+---+---+---+---------+ | I | P | O | ROW_NUM | |---+---+---+---------| | 1 | A | 1 | 1 | | 3 | B | 1 | 1 | +---+---+---+---------+