- 카테고리:
QUALIFY¶
SELECT 문에서 QUALIFY 절은 윈도우 함수의 결과를 필터링합니다.
QUALIFY는 HAVING이 집계 함수 및 GROUP BY 절로 수행하는 작업을 윈도우 함수로 수행합니다.
따라서 쿼리 실행 순서에서 QUALIFY는 윈도우 함수가 계산된 후에 평가됩니다. 일반적으로 SELECT 문의 절은 다음과 같은 순서로 평가됩니다.
From
Where
Group by
Having
Window
QUALIFY
Distinct
Order by
Limit
구문¶
QUALIFY <predicate>
QUALIFY가 있는 문의 일반적인 형식은 다음과 유사합니다(순서에 따라 일부 변형이 허용되지만, 표시되지는 않음).
SELECT <column_list>
FROM <data_source>
[GROUP BY ...]
[HAVING ...]
QUALIFY <predicate>
[ ... ]
사용법 노트¶
QUALIFY 절을 사용하려면 SELECT 문의 다음 절 중 하나 이상에 하나 이상의 윈도우 함수를 지정해야 합니다.
SELECT 열 목록.
QUALIFY 절의 필터 조건자.
이들 각각의 예는 아래의 예 섹션에 나와 있습니다.
윈도우 함수를 포함한 SELECT 목록의 식은 SELECT 목록에 정의된 열 별칭으로 참조할 수 있습니다.
QUALIFY는 조건자에서 집계 및 하위 쿼리를 지원합니다. 집계의 경우, HAVING 절과 동일한 규칙이 적용됩니다.
QUALIFY라는 단어는 예약어입니다.
QUALIFY의 Snowflake 구문은 ANSI 표준의 일부가 아닙니다.
예¶
QUALIFY 절은 윈도우 함수의 결과에 대한 필터링이 필요한 쿼리를 단순화합니다. QUALIFY가 없으면 필터링에 중첩이 필요합니다. 아래 예에서는 ROW_NUMBER() 함수를 사용하여 각 파티션의 첫 번째 행만 반환합니다.
테이블을 만들고 로딩합니다.
CREATE TABLE qt (i INTEGER, p CHAR(1), o INTEGER); INSERT INTO qt (i, p, o) VALUES (1, 'A', 1), (2, 'A', 2), (3, 'B', 1), (4, 'B', 2);이 쿼리는 QUALIFY가 아닌 중첩을 사용합니다.
SELECT * FROM ( SELECT i, p, o, ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num FROM qt ) WHERE row_num = 1 ; +---+---+---+---------+ | I | P | O | ROW_NUM | |---+---+---+---------| | 1 | A | 1 | 1 | | 3 | B | 1 | 1 | +---+---+---+---------+이 쿼리는 QUALIFY 를 사용합니다.
SELECT i, p, o FROM qt QUALIFY ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) = 1 ; +---+---+---+ | I | P | O | |---+---+---| | 1 | A | 1 | | 3 | B | 1 | +---+---+---+
또한, QUALIFY를 사용하여, SELECT 열 목록에 있는 윈도우 함수를 참조할 수 있습니다.
SELECT i, p, o, ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num FROM qt QUALIFY row_num = 1 ; +---+---+---+---------+ | I | P | O | ROW_NUM | |---+---+---+---------| | 1 | A | 1 | 1 | | 3 | B | 1 | 1 | +---+---+---+---------+이전 쿼리에서 QUALIFY를 제거하고 출력을 비교하여 QUALIFY가 필터로 작동하는 방식을 확인할 수 있습니다.
SELECT i, p, o, ROW_NUMBER() OVER (PARTITION BY p ORDER BY o) AS row_num FROM qt ; +---+---+---+---------+ | I | P | O | ROW_NUM | |---+---+---+---------| | 1 | A | 1 | 1 | | 2 | A | 2 | 2 | | 3 | B | 1 | 1 | | 4 | B | 2 | 2 | +---+---+---+---------+
QUALIFY 절은 또한 집계와 결합될 수 있으며 조건자에서 하위 쿼리를 가질 수 있습니다. 예:
SELECT c2, SUM(c3) OVER (PARTITION BY c2) as r FROM t1 WHERE c3 < 4 GROUP BY c2, c3 HAVING SUM(c1) > 3 QUALIFY r IN ( SELECT MIN(c1) FROM test GROUP BY c2 HAVING MIN(c1) > 3);