APPROX_PERCENTILE_ACCUMULATE
APPROX_PERCENTILE_ACCUMULATE
집계가 끝날 때 t-Digest 상태의 내부 표현(JSON 객체)을 돌려주는 근사 백분위수 집계 함수예요. APPROX_PERCENTILE과 달리 백분위수 값이 아니라 알고리즘의 중간 상태 자체를 반환해요.
출처: 공식 문서
본문
집계가 끝날 때 t-Digest 상태의 내부 표현(JSON 객체로)을 반환합니다. (t-Digest에 대한 자세한 내용은 Estimating Percentile Values를 참고하세요.)
APPROX_PERCENTILE 함수는 최종 백분위수 추정치가 반환될 때 이 내부 중간 상태를 버립니다. 그러나 대량 로딩 도중 증분 백분위수를 추정하는 같은 고급 사용 사례에서는 중간 상태를 유지하고 싶을 수 있는데, 그런 경우 APPROX_PERCENTILE 대신 APPROX_PERCENTILE_ACCUMULATE를 사용합니다.
APPROX_PERCENTILE_ACCUMULATE는 백분위수 값을 반환하지 않습니다. 대신 알고리즘 상태 자체를 반환합니다. 중간 상태는 나중에:
- 분리되어 있지만 관련된 데이터 배치의 다른 중간 상태와 결합(즉 병합)될 수 있습니다.
- 중간 상태에 직접 작동하는 다른 함수, 예를 들어 APPROX_PERCENTILE_ESTIMATE로 처리될 수 있습니다. (예제는 아래 예제 섹션을 참고하세요.)
- 외부 도구로 내보내질 수 있습니다.
참고 (See also): APPROX_PERCENTILE_COMBINE , APPROX_PERCENTILE_ESTIMATE
구문 (Syntax)
APPROX_PERCENTILE_ACCUMULATE( <expr> )
인자 (Arguments)
expr
숫자 값으로 평가되는 유효한 표현식(예: 컬럼 이름)입니다.
사용 참고 (Usage notes)
- 백분위수는 숫자 값에서만 작동하므로
expr은 숫자이거나 숫자로 캐스팅할 수 있는 값을 생성해야 합니다. - 소수 부동 소수점(DECFLOAT) 값은 지원되지 않습니다.
예제 (Example)
testtable.c1 컬럼의 t-Digest 상태를 테이블에 저장한 다음 그 상태로 백분위수를 계산합니다:
CREATE OR REPLACE TABLE resultstate AS
SELECT APPROX_PERCENTILE_ACCUMULATE(c1) AS s
FROM testtable;
SELECT APPROX_PERCENTILE_ESTIMATE(s, 0.015)
FROM resultstate;
SELECT APPROX_PERCENTILE_ESTIMATE(s, 0.2)
FROM resultstate;
다음은 세 관련 함수(APPROX_PERCENTILE_ACCUMULATE, APPROX_PERCENTILE_ESTIMATE, APPROX_PERCENTILE_COMBINE)의 사용을 보여주는 더 포괄적인 예제입니다.
간단한 테이블과 데이터를 만듭니다:
CREATE OR REPLACE TABLE test_table1 (c1 INTEGER);
INSERT INTO test_table1 (c1) VALUES (1), (2), (3), (4);
test_table1 테이블의 현재 근사 백분위수 정보를 나타내는 "상태"를 담는 테이블을 만듭니다:
CREATE OR REPLACE TABLE resultstate1 AS (
SELECT APPROX_PERCENTILE_ACCUMULATE(c1) AS rs1
FROM test_table1);
그 상태 정보를 사용해 중간값의 현재 추정치를 표시합니다(0.5는 50번째 백분위수의 값을 원한다는 뜻):
SELECT APPROX_PERCENTILE_ESTIMATE(rs1, 0.5)
FROM resultstate1;
+--------------------------------------+
| APPROX_PERCENTILE_ESTIMATE(RS1, 0.5) |
|--------------------------------------|
| 2.5 |
+--------------------------------------+
이제 두 번째 테이블을 만들고 데이터를 추가합니다. (더 현실적인 상황에서는 사용자가 첫 번째 테이블에 더 많은 데이터를 로드하고, 데이터가 로드된 시간을 기준으로 데이터를 겹치지 않는 집합으로 나눌 수 있습니다.)
CREATE OR REPLACE TABLE test_table2 (c1 INTEGER);
INSERT INTO test_table2 (c1) VALUES (5), (6), (7), (8);
새 데이터에 대한 "상태" 정보를 가져옵니다.
CREATE OR REPLACE TABLE resultstate2 AS
(SELECT APPROX_PERCENTILE_ACCUMULATE(c1) AS rs1
FROM test_table2);
두 배치의 행에 대한 "상태" 정보를 결합합니다:
CREATE OR REPLACE TABLE combined_resultstate (c1) AS
SELECT APPROX_PERCENTILE_COMBINE(rs1) AS apc1
FROM (
SELECT rs1 FROM resultstate1
UNION ALL
SELECT rs1 FROM resultstate2
);
결합된 행 집합의 근사 중간값을 가져옵니다:
SELECT APPROX_PERCENTILE_ESTIMATE(c1, 0.5)
FROM combined_resultstate;
+-------------------------------------+
| APPROX_PERCENTILE_ESTIMATE(C1, 0.5) |
|-------------------------------------|
| 4.5 |
+-------------------------------------+
더 알아보기 (Learn more)
- APPROX_PERCENTILE — 직접 백분위수 추정
- APPROX_PERCENTILE_COMBINE — 상태 결합
- APPROX_PERCENTILE_ESTIMATE — 상태로 백분위수 계산
- Estimating Percentile Values