Amazon Redshift unterstützt ab dem 1. November 2025 nicht mehr die Erstellung neuer Python-UDFs. Wenn Sie Python-UDFs verwenden möchten, erstellen Sie die UDFs vor diesem Datum. Bestehende Python-UDFs funktionieren weiterhin wie gewohnt. Weitere Informationen finden Sie im Blog-Posting
QUALIFY-Klausel
Die QUALIFY-Klausel filtert die Ergebnisse einer zuvor berechneten Fensterfunktion anhand benutzerdefinierter Suchbedingungen. Sie können die Klausel verwenden, um Filterbedingungen auf das Ergebnis einer Fensterfunktion anzuwenden, ohne eine Unterabfrage zu verwenden.
Die Klausel ist der HAVING-Klausel ähnlich, die eine Bedingung anwendet, um Zeilen aus einer WHERE-Klausel weiter zu filtern. Der Unterschied zwischen QUALIFY und HAVING besteht darin, dass gefilterte Ergebnisse aus der QUALIFY-Klausel auf dem Ergebnis der Ausführung von Fensterfunktionen für die Daten basieren können. Sie können sowohl die QUALIFY- als auch die HAVING-Klausel in einer Abfrage verwenden.
Syntax
QUALIFY condition
Anmerkung
Wenn Sie die QUALIFY-Klausel direkt nach der FROM-Klausel benutzen, muss vor der QUALIFY-Klausel vor dem Namen der FROM-Beziehung ein Alias angegeben werden.
Beispiele
Für die Beispiele in diesem Abschnitt werden die unten angegebenen Beispieldaten verwendet.
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);
Das folgende Beispiel zeigt, wie Sie die beiden teuersten Artikel finden, die täglich nach 12:00 Uhr verkauft werden.
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
Sie können dann den letzten Artikel finden, der jeden Tag verkauft wurde.
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
Das folgende Beispiel gibt die gleichen Datensätze wie die vorherige Abfrage zurück (den letzten Artikel, der jeden Tag verkauft wurde), verwendet dabei jedoch nicht die QUALIFY-Klausel.
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