Skip to main content

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_namefunction_namefunction_rank
main!__postfix1
main!~~2
pg_catalogcol_description1
pg_catalogformat_pg_type2

Syntax