APPROX_COUNT_DISTINCT

APPROX_COUNT_DISTINCT

APPROX_COUNT_DISTINCT는 HyperLogLog를 사용해 입력의 고유(distinct) 카디널리티 근사값을 반환하는 집계·윈도우 함수예요. (즉 HLL(col1, col2, ...)은 COUNT(DISTINCT col1, col2, ...)의 근사값을 반환해요.) 또한 HLL의 별칭이에요.

출처: Snowflake SQL Reference

본문

카테고리: 집계 함수 (Cardinality Estimation), 윈도우 함수

HyperLogLog에 대한 자세한 내용은 고유 값 수 추정을 참고해요.

구문 (Syntax)

집계 함수

APPROX_COUNT_DISTINCT( [ DISTINCT ] <expr1>  [ , ... ] )

APPROX_COUNT_DISTINCT(*)

윈도우 함수

APPROX_COUNT_DISTINCT( [ DISTINCT ] <expr1>  [ , ... ] ) OVER ( [ PARTITION BY <expr2> ] )

APPROX_COUNT_DISTINCT(*) OVER ( [ PARTITION BY <expr2> ] )

인자 (Arguments)

<expr1> — 고유 값 수를 알고 싶은 표현식이에요.

<expr2> — 행을 파티션으로 그룹화하는 데 사용되는 선택적 표현식이에요.

* — NULL 값을 제외한 총 레코드 수의 근사값을 반환해요. 함수에 와일드카드를 전달할 때 테이블의 이름이나 별칭으로 와일드카드를 한정할 수 있어요. 예를 들어 mytable이라는 테이블의 모든 열을 전달하려면 다음을 지정해요:

(mytable.*)

필터링에 ILIKE와 EXCLUDE 키워드도 사용할 수 있어요:

  • ILIKE는 지정한 패턴과 일치하는 열 이름을 필터링해요. 패턴은 하나만 허용돼요. 예:
(* ILIKE 'col1%')
  • EXCLUDE는 지정한 열과 일치하지 않는 열 이름을 필터링해요. 예:
(* EXCLUDE col1)
(* EXCLUDE (col1, col2))

이 키워드를 사용할 때 한정자(qualifier)는 유효해요. 다음 예시는 mytable 테이블에서 패턴 col1%와 일치하는 모든 열을 ILIKE 키워드로 필터링해요:

(mytable.* ILIKE 'col1%')

ILIKE와 EXCLUDE 키워드는 한 번의 함수 호출에서 결합할 수 없어요. 이 함수에서 ILIKE와 EXCLUDE 키워드는 SELECT 목록 또는 GROUP BY 절에서만 유효해요. ILIKE와 EXCLUDE 키워드에 대한 자세한 내용은 SELECT의 "파라미터" 섹션을 참고해요.

반환값 (Returns)

반환되는 값의 데이터 타입은 INTEGER예요.

사용 시 유의사항 (Usage notes)

  • 계산은 근사값이지만 결정적이에요. 같은 입력 데이터로 호출하면 이 함수는 같은 결과를 반환해요.
  • NULL 값과 집계 함수에 대한 정보는 집계 함수와 NULL 값을 참고해요.
  • 윈도우 함수로 호출할 때 다음을 지원하지 않아요:
    • OVER 절 안의 ORDER BY 절
    • 명시적 윈도우 프레임

예시 (Examples)

이 예시는 APPROX_COUNT_DISTINCT와 그 별칭 HLL을 사용하는 방법을 보여줘요. 이 예시는 COUNT(DISTINCT i)와 APPROX_COUNT_DISTINCT(i)를 모두 호출해 두 함수의 결과가 항상 정확히 일치하지는 않음을 강조해요.

APPROX_COUNT_DISTINCT는 정확한 값이 아닌 근사값을 반환하므로 다음 쿼리의 정확한 출력은 달라질 수 있어요.

SELECT COUNT(i), COUNT(DISTINCT i), APPROX_COUNT_DISTINCT(i), HLL(i)
  FROM sequence_demo;
+----------+-------------------+--------------------------+--------+
| COUNT(I) | COUNT(DISTINCT I) | APPROX_COUNT_DISTINCT(I) | HLL(I) |
|----------+-------------------+--------------------------+--------|
|     1024 |              1024 |                     1007 |   1007 |
+----------+-------------------+--------------------------+--------+

더 알아보기