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 앞이에요.
예제 (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 |