Запрос QUALIFY
Оператор QUALIFY используется для фильтрации результатов WINDOW функций. Эта фильтрация результатов аналогична тому, как оператор HAVING фильтрует результаты агрегатных функций, применяемых на основе оператора GROUP BY.
Оператор QUALIFY позволяет избежать использования подзапросов или оператора WITH для выполнения этой фильтрации (подобно тому, как оператор HAVING позволяет избежать подзапроса). Пример использования оператора WITH вместо оператора QUALIFY приведен ниже примеров QUALIFY.
Обратите внимание, что фильтрация выполняется на основе WINDOW функций, а не обязательно на основе оператора WINDOW. Оператор WINDOW является необязательным и может использоваться для упрощения создания нескольких выражений WINDOW функций.
Оператор QUALIFY указывается после оператора WINDOW в операторе SELECT (WINDOW не обязательно указывать) и перед оператором ORDER BY.
Примеры
Каждый из следующих примеров создаёт тот же результат, который приведён ниже.
Фильтрация на основе функции окна, определённой в операторе QUALIFY:
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; Фильтрация на основе функции окна, определённой в операторе SELECT:
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; Фильтрация на основе функции окна, определённой в операторе QUALIFY , но с использованием оператора WINDOW:
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; Фильтрация на основе функции окна, определённой в операторе SELECT , но с использованием оператора WINDOW:
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; Эквивалентный запрос на основе оператора WITH (без оператора QUALIFY):
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 |
Синтаксис
© Copyright 2018–2024 Stichting DuckDB Foundation
Licensed under the MIT License.
https://duckdb.org/docs/sql/query_syntax/qualify.html