APPROX_TOP_K_ACCUMULATE

APPROX_TOP_K_ACCUMULATE

집계가 끝날 때의 Space-Saving 요약(summary)을 반환해요. (Space-Saving 요약에 대한 자세한 내용은 Estimating Frequent Values를 참고해요.)

APPROX_TOP_K 함수는 최종 카디널리티 추정치가 반환될 때 내부 중간 상태를 버려요. 그러나 대량 적재 중 증가하는 빈번한 값을 추정하는 것 같은 특정 고급 사용 사례에서는 중간 상태를 유지하고 싶을 수 있는데, 그런 경우 APPROX_TOP_K 대신 APPROX_TOP_K_ACCUMULATE를 사용해요.

APPROX_TOP_K와 달리 APPROX_TOP_K_ACCUMULATE는 항목의 빈도 추정치를 반환하지 않아요. 대신 알고리즘 상태 자체를 반환해요. 중간 상태는 나중에 다음이 가능해요.

  • 별개지만 관련된 데이터 배치의 중간 상태와 결합(즉 병합).
  • 중간 상태에서 직접 작동하는 다른 함수(예: APPROX_TOP_K_ESTIMATE)로 처리. (예시는 아래의 예시 섹션을 참고해요.)
  • 외부 도구로 내보내기.

출처: Snowflake SQL Reference - APPROX_TOP_K_ACCUMULATE

본문

구문

APPROX_TOP_K_ACCUMULATE( <expr> , <counters> )

인자

  • 가장 흔한 값을 찾으려는 표현식(예: 컬럼 이름)이에요.
  • 추정 과정 중 한 번에 추적할 수 있는 고유 값의 최대 수예요. 예를 들어 counters가 100000으로 설정되면 알고리즘은 100,000개의 고유 값을 추적하며, 가장 빈번한 100,000개 값을 유지하려고 해요. counters의 최대 값은 100000(100,000)이에요.

사용상 주의사항

  • 10진 부동 소수(DECFLOAT) 값은 지원되지 않아요.

예시

이 예시는 세 개의 관련 함수 APPROX_TOP_K_ACCUMULATE, APPROX_TOP_K_ESTIMATE, APPROX_TOP_K_COMBINE을 사용하는 방법을 보여줘요.

참고: 이 예시는 일관된 결과를 얻기 위해 고유 데이터 값보다 많은 카운터를 사용해요. 실제 애플리케이션에서는 고유 값의 수가 보통 카운터 수보다 많으므로 근사값이 달라질 수 있어요.

이 예시는 값 18을 가진 8개 행이 있는 첫 번째 테이블과 값 512를 가진 8개 행이 있는 두 번째 테이블을 생성해요. 따라서 두 테이블의 합집합에서 가장 빈번한 값은 5-8이고, 각각 카운트가 2예요.

간단한 테이블과 데이터를 만들어요.

CREATE OR REPLACE SEQUENCE seq91;
CREATE OR REPLACE TABLE sequence_demo (c1 INTEGER DEFAULT seq91.NEXTVAL, dummy SMALLINT);
INSERT INTO sequence_demo (dummy) VALUES (0);

INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;

sequence_demo라는 테이블의 현재 근사 Top K 정보를 나타내는 '상태(state)'를 포함하는 테이블을 만들어요.

CREATE OR REPLACE TABLE resultstate1 AS (
  SELECT APPROX_TOP_K_ACCUMULATE(c1, 50) AS rs1
    FROM sequence_demo);

이제 두 번째 테이블을 만들고 데이터를 추가해요. (더 현실적인 상황에서는 사용자가 첫 번째 테이블에 더 많은 데이터를 적재하고, 데이터가 적재된 시간에 따라 데이터를 서로 겹치지 않는 집합으로 나눴을 수 있어요.)

CREATE OR REPLACE TABLE test_table2 (c1 INTEGER);
INSERT INTO test_table2 (c1) SELECT c1 + 4 FROM sequence_demo;

새 데이터에 대한 '상태' 정보만 가져와요.

CREATE OR REPLACE TABLE resultstate2 AS
  (SELECT APPROX_TOP_K_ACCUMULATE(c1, 50) AS rs1
     FROM test_table2);

두 배치의 행에 대한 '상태' 정보를 결합해요.

CREATE OR REPLACE TABLE combined_resultstate (c1) AS
  SELECT APPROX_TOP_K_COMBINE(rs1) AS apc1
    FROM (
      SELECT rs1 FROM resultstate1
      UNION ALL
      SELECT rs1 FROM resultstate2
    );

결합된 행 집합의 근사 Top K 값을 가져와요.

SELECT APPROX_TOP_K_ESTIMATE(c1, 4)
  FROM combined_resultstate;

+------------------------------+
| APPROX_TOP_K_ESTIMATE(C1, 4) |
|------------------------------|
| [                            |
|   [                          |
|     5,                       |
|     2                        |
|   ],                         |
|   [                          |
|     6,                       |
|     2                        |
|   ],                         |
|   [                          |
|     7,                       |
|     2                        |
|   ],                         |
|   [                          |
|     8,                       |
|     2                        |
|   ]                          |
| ]                            |
+------------------------------+

더 알아보기