QUALIFY-Klausel - Amazon Redshift

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

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 ähnelt der HAVING-Klausel, 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) <= 2 ss_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 an jedem 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

Im folgenden Beispiel werden dieselben Datensätze wie bei der vorherigen Abfrage zurückgegeben, d. h. der letzte verkaufte Artikel an jedem Tag, aber die QUALIFY-Klausel wird nicht verwendet.

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