QUALIFY Clause
The QUALIFY
clause is used to filter the results of WINDOW
functions. This filtering of results is similar to how a HAVING
clause filters the results of aggregate functions applied based on the GROUP BY
clause.
The QUALIFY
clause avoids the need for a subquery or WITH clause to perform this filtering (much like HAVING
avoids a subquery). An example using a WITH
clause instead of QUALIFY
is included below the QUALIFY
examples.
Note that this is filtering based on WINDOW
functions, not necessarily based on the WINDOW
clause. The WINDOW
clause is optional and can be used to simplify the creation of multiple WINDOW
function expressions.
The position of where to specify a QUALIFY
clause is following the WINDOW
clause in a SELECT
statement (WINDOW
does not need to be specified), and before the ORDER BY
.
Examples
Each of the following examples produce the same output, located below.
-- Filter based on a WINDOW function defined in the QUALIFY clause
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;
-- Filter based on a WINDOW function defined in the SELECT clause
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;
-- Filter based on a WINDOW function defined in the QUALIFY clause, but using the WINDOW clause
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;
-- Filter based on a WINDOW function defined in the SELECT clause, but using the WINDOW clause
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;
-- Equivalent query based on a WITH clause (without QUALIFY clause)
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 |