QUALIFY-Klausel
Die QUALIFY-Klausel filtert die Ergebnisse von WINDOW-Funktionen. Diese Filterung entspricht der Art, wie eine HAVING-Klausel die Ergebnisse von Aggregatfunktionen filtert, die auf Basis der GROUP BY-Klausel berechnet wurden.
Die QUALIFY-Klausel erspart eine Unterabfrage oder WITH-Klausel für diese Filterung (ähnlich wie HAVING eine Unterabfrage vermeidet). Ein Beispiel mit WITH statt QUALIFY steht unter den QUALIFY-Beispielen.
Beachten Sie, dass hier nach WINDOW-Funktionen gefiltert wird, nicht unbedingt nach der WINDOW-Klausel. Die WINDOW-Klausel ist optional und kann die Erstellung mehrerer WINDOW-Funktionsausdrücke vereinfachen.
Die QUALIFY-Klausel steht in einer SELECT-Anweisung nach der WINDOW-Klausel (WINDOW muss nicht angegeben werden) und vor ORDER BY.
Beispiele
Jedes der folgenden Beispiele liefert dieselbe Ausgabe, die unten steht.
Filtert anhand einer Fensterfunktion, die in der QUALIFY-Klausel definiert ist:
SELECT schema_name, function_name, -- In this example the function_rank column in the select clause is for reference row_number() OVER (PARTITION BY schema_name ORDER BY function_name) AS function_rankFROM duckdb_functions()QUALIFY row_number() OVER (PARTITION BY schema_name ORDER BY function_name) < 3;Filtert anhand einer Fensterfunktion, die in der SELECT-Klausel definiert ist:
SELECT schema_name, function_name, row_number() OVER (PARTITION BY schema_name ORDER BY function_name) AS function_rankFROM duckdb_functions()QUALIFY function_rank < 3;Filtert anhand einer Fensterfunktion, die in der QUALIFY-Klausel definiert ist, aber die WINDOW-Klausel verwendet:
SELECT schema_name, function_name, -- In this example the function_rank column in the select clause is for reference row_number() OVER my_window AS function_rankFROM duckdb_functions()WINDOW my_window AS (PARTITION BY schema_name ORDER BY function_name)QUALIFY row_number() OVER my_window < 3;Filtert anhand einer Fensterfunktion, die in der SELECT-Klausel definiert ist, aber die WINDOW-Klausel verwendet:
SELECT schema_name, function_name, row_number() OVER my_window AS function_rankFROM duckdb_functions()WINDOW my_window AS (PARTITION BY schema_name ORDER BY function_name)QUALIFY function_rank < 3;Gleichwertige Abfrage mit einer WITH-Klausel (ohne QUALIFY-Klausel):
WITH ranked_functions AS ( SELECT schema_name, function_name, row_number() OVER (PARTITION BY schema_name ORDER BY function_name) AS function_rank FROM duckdb_functions())SELECT *FROM ranked_functionsWHERE function_rank < 3;| schema_name | function_name | function_rank |
|---|---|---|
| main | !__postfix | 1 |
| main | !~~ | 2 |
| pg_catalog | col_description | 1 |
| pg_catalog | format_pg_type | 2 |