Zum Inhalt springen

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_rank
FROM 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_rank
FROM 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_rank
FROM 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_rank
FROM 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_functions
WHERE
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

Syntax