APPROX_COUNT_DISTINCT
APPROX_COUNT_DISTINCT
APPROX_COUNT_DISTINCT는 HyperLogLog를 사용해 입력의 고유(distinct) 카디널리티 근사값을 반환하는 집계·윈도우 함수예요. (즉 HLL(col1, col2, ...)은 COUNT(DISTINCT col1, col2, ...)의 근사값을 반환해요.) 또한 HLL의 별칭이에요.
본문
카테고리: 집계 함수 (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 |
+----------+-------------------+--------------------------+--------+