QUALIFY 절

QUALIFY 절 (QUALIFY Clause)

윈도우 함수(Window functions)의 결과를 필터링하고 싶을 때 QUALIFY 절을 써요. 이 필터링은 GROUP BY 절을 기반으로 적용된 집계 함수의 결과를 HAVING이 필터링하는 방식과 비슷해요. QUALIFY 절은 이러한 필터링을 수행하기 위해 서브쿼리나 WITH이 필요하지 않게 해줘요 (HAVING이 서브쿼리를 피하게 해주는 것과 마찬가지예요). QUALIFY 대신 WITH 절을 사용한 예제가 QUALIFY 예제 아래에 포함되어 있어요.

이 필터링이 WINDOW 함수를 기반으로 한다는 점을 참고하세요. 반드시 WINDOW을 기반으로 하는 것은 아니에요. WINDOW 절은 선택 사항이며, 여러 WINDOW 함수 표현식을 만들 때 단순화하는 데 사용할 수 있어요.

QUALIFY 절을 지정하는 위치는 SELECT 문에서 WINDOW 다음(WINDOW를 지정할 필요는 없음)이고, ORDER BY 앞이에요.

출처: DuckDB 공식 문서 — QUALIFY

예제 (Examples)

다음 각 예제는 아래에 있는 동일한 출력을 만들어내요.

QUALIFY 절에 정의된 윈도우 함수를 기반으로 필터링해요:

SELECT
    schema_name,
    function_name,
    -- 이 예제에서 select 절의 function_rank 열은 참고용이에요
    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,
    -- 이 예제에서 select 절의 function_rank 열은 참고용이에요
    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

더 알아보기 (Learn more)