카테고리:

쿼리 구문

QUALIFY

SELECT 문에서 QUALIFY 절은 윈도우 함수의 결과를 필터링합니다.

QUALIFY는 HAVING이 집계 함수 및 GROUP BY 절로 수행하는 작업을 윈도우 함수로 수행합니다.

따라서 쿼리 실행 순서에서 QUALIFY는 윈도우 함수가 계산된 후에 평가됩니다. 일반적으로 SELECT 문의 절은 다음과 같은 순서로 평가됩니다.

  1. From

  2. Where

  3. Group by

  4. Having

  5. Window

  6. QUALIFY

  7. Distinct

  8. Order by

  9. Limit

구문

QUALIFY <predicate>
Copy

QUALIFY가 있는 문의 일반적인 형식은 다음과 유사합니다(순서에 따라 일부 변형이 허용되지만, 표시되지는 않음).

SELECT <column_list>
  FROM <data_source>
  [GROUP BY ...]
  [HAVING ...]
  QUALIFY <predicate>
  [ ... ]
Copy
column_list

이는 일반적으로 SELECT 문의 프로젝션 절에 대한 규칙을 따릅니다.

data_source

데이터 소스는 일반적으로 테이블이지만 뷰, UDTF(사용자 정의 테이블 함수) 등 테이블과 유사한 다른 데이터 소스일 수 있습니다.

predicate

조건자는 집계 및 윈도우 함수가 계산된 후 결과를 필터링하는 식입니다. 조건자는 HAVING 절과 유사하되 HAVING 키워드가 없어야 합니다. 또한, 조건자는 윈도우 함수를 포함할 수도 있습니다.

조건자 예는 이 항목에 있는 섹션을 참조하십시오.

사용법 노트

  • 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);
Copy

이 쿼리는 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 |
+---+---+---+---------+
Copy

이 쿼리는 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 |
+---+---+---+
Copy

또한, 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 |
+---+---+---+---------+
Copy

이전 쿼리에서 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 |
+---+---+---+---------+
Copy

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);
Copy