Amazon Redshift ne prendra plus en charge la création de nouvelles fonctions Python définies par l’utilisateur à compter du 1er novembre 2025. Si vous souhaitez utiliser des fonctions Python définies par l’utilisateur, créez-les avant cette date. Les fonctions Python définies par l’utilisateur existantes continueront de fonctionner normalement. Pour plus d’informations, consultez le billet de blog
Clause QUALIFY
La clause QUALIFY filtre les résultats d’une fonction de fenêtre précédemment calculée en fonction des conditions de recherche définies par l’utilisateur. Vous pouvez utiliser la clause pour appliquer des conditions de filtrage au résultat d’une fonction de fenêtre sans utiliser de sous-requête.
Elle est similaire à la clause HAVING, qui applique une condition à d’autres lignes de filtre à partir d’une clause WHERE. La différence entre QUALIFY et HAVING réside dans le fait que les résultats filtrés de la clause QUALIFY peuvent être basés sur le résultat de l’exécution de fonctions de fenêtre sur les données. Vous pouvez utiliser à la fois les clauses QUALIFY et HAVING dans une même requête.
Syntaxe
QUALIFY condition
Note
Si vous utilisez la clause QUALIFY directement après la clause FROM, le nom de la relation FROM doit comporter un alias spécifié avant la clause QUALIFY.
Exemples
Les exemples de cette section utilisent les exemples de données ci-dessous.
create table store_sales (ss_sold_date date, ss_sold_time time, ss_item text, ss_sales_price float); insert into store_sales values ('2022-01-01', '09:00:00', 'Product 1', 100.0), ('2022-01-01', '11:00:00', 'Product 2', 500.0), ('2022-01-01', '15:00:00', 'Product 3', 20.0), ('2022-01-01', '17:00:00', 'Product 4', 1000.0), ('2022-01-01', '18:00:00', 'Product 5', 30.0), ('2022-01-02', '10:00:00', 'Product 6', 5000.0), ('2022-01-02', '16:00:00', 'Product 7', 5.0);
L’exemple suivant montre comment trouver les deux articles les plus chers vendus après midi chaque jour.
SELECT * FROM store_sales ss WHERE ss_sold_time > time '12:00:00' QUALIFY row_number() OVER (PARTITION BY ss_sold_date ORDER BY ss_sales_price DESC) <= 2ss_sold_date | ss_sold_time | ss_item | ss_sales_price --------------+--------------+-----------+---------------- 2022-01-01 | 17:00:00 | Product 4 | 1000 2022-01-01 | 18:00:00 | Product 5 | 30 2022-01-02 | 16:00:00 | Product 7 | 5
Vous pouvez ensuite retrouver le dernier article vendu chaque jour.
SELECT * FROM store_sales ss QUALIFY last_value(ss_item) OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) = ss_item;ss_sold_date | ss_sold_time | ss_item | ss_sales_price --------------+--------------+-----------+---------------- 2022-01-01 | 18:00:00 | Product 5 | 30 2022-01-02 | 16:00:00 | Product 7 | 5
L’exemple suivant renvoie les mêmes enregistrements que pour la requête précédente, le dernier article vendu chaque jour, mais n’utilise pas la clause QUALIFY.
SELECT * FROM ( SELECT *, last_value(ss_item) OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) ss_last_item FROM store_sales ss ) WHERE ss_last_item = ss_item;ss_sold_date | ss_sold_time | ss_item | ss_sales_price | ss_last_item --------------+--------------+-----------+----------------+-------------- 2022-01-02 | 16:00:00 | Product 7 | 5 | Product 7 2022-01-01 | 18:00:00 | Product 5 | 30 | Product 5