카테고리:

집계 함수 (백분위수 추정) , 윈도우 함수

APPROX_PERCENTILE_ACCUMULATE

집계 종료 시 t-Digest 상태의 내부 표현을 (JSON 오브젝트로) 반환합니다. (t-Digest에 대한 자세한 내용은 다음 참조: 백분위수 값 추정하기.)

APPROX_PERCENTILE 함수는 최종 백분위수 추정치가 반환될 때 이 내부 중간 상태를 버립니다. 그러나 대량 로딩 중 증분 백분위수를 추정하는 것과 같은 특정 고급 사용 사례에서는 사용자가 중간 상태를 유지하려고 할 수 있습니다. 이 경우 APPROX_PERCENTILE 대신 APPROX_PERCENTILE_ACCUMULATE 를 사용합니다.

APPROX_PERCENTILE_ACCUMULATE 는 백분위수 값을 반환하지 않습니다. 대신 알고리즘 상태 자체를 반환합니다. 중간 상태는 나중에 다음과 같을 수 있습니다.

  • 별개이지만 관련된 데이터 배치의 다른 중간 상태와 결합(즉, 병합)됩니다.

  • 중간 상태에서 직접 작동하는 다른 함수(예: APPROX_PERCENTILE_ESTIMATE)에 의해 처리됩니다. (예를 들어, 아래의 예 섹션을 참조하십시오.)

  • 외부 도구로 내보냅니다.

참고 항목:

APPROX_PERCENTILE_COMBINE , APPROX_PERCENTILE_ESTIMATE

구문

APPROX_PERCENTILE_ACCUMULATE( <expr> )
Copy

인자

expr

숫자 값으로 평가되는 유효한 식(예: 열 이름)입니다.

사용법 노트

  • 백분위수는 숫자 값에서만 작동하므로 expr 은 숫자이거나 숫자로 캐스팅할 수 있는 값을 생성해야 합니다.

testTable.c1 열의 t-Digest 상태를 테이블에 저장한 다음, 상태를 사용하여 백분위수를 계산합니다.

-- create a table from the accumulated t-Digest state for testtable.c1
create or replace table resultstate as
    select approx_percentile_accumulate(c1) s from testtable;

-- Next, use the t-Digest state to compute percentiles for testtable.

-- returns an approximated value for the 1.5th percentile of testtable.c1
select approx_percentile_estimate(s, 0.015) from resultstate;

-- returns an approximated value for the 20th percentile of testtable.c1
select approx_percentile_estimate(s, 0.2) from resultstate;
Copy

다음은 보다 광범위한 예입니다. 이는 세 가지 관련 함수, 즉 APPROX_PERCENTILE_ACCUMULATE, APPROX_PERCENTILE_ESTIMATE, APPROX_PERCENTILE_COMBINE 의 사용법을 보여줍니다.

간단한 테이블과 데이터를 만듭니다.

-- Create a table and insert some rows for which we'll later estimate the 
-- median value (the value at the 50th percentile).
CREATE OR REPLACE TABLE test_table1 (c1 INTEGER);
-- Insert data.
INSERT INTO test_table1 (c1) VALUES (1), (2), (3), (4);
Copy

test_table1이라는 테이블에 대한 현재의 대략적인 백분위수 정보를 나타내는 “상태”가 포함된 테이블을 만듭니다.

CREATE OR REPLACE TABLE resultstate1 AS (
     SELECT approx_percentile_accumulate(c1) AS rs1
        FROM test_table1);
Copy

해당 상태 정보를 사용하여 중앙값의 현재 추정치를 표시합니다(0.5는 50번째 백분위수의 값이 필요함을 의미함).

SELECT approx_percentile_estimate(rs1, 0.5) 
    FROM resultstate1;
Copy

출력:

SELECT approx_percentile_estimate(rs1, 0.5) 
    FROM resultstate1;
+--------------------------------------+
| APPROX_PERCENTILE_ESTIMATE(RS1, 0.5) |
|--------------------------------------|
|                                  2.5 |
+--------------------------------------+
Copy

이제 두 번째 테이블을 만들고 데이터를 추가합니다. (보다 현실적인 상황에서 사용자는 첫 번째 테이블에 더 많은 데이터를 로딩하고, 데이터가 로딩된 시간을 기준으로 데이터를 겹치지 않는 세트로 나눌 수 있었습니다.)

CREATE OR REPLACE TABLE test_table2 (c1 INTEGER);
-- Insert data.
INSERT INTO test_table2 (c1) VALUES (5), (6), (7), (8);
Copy

새 데이터에 대한 “상태” 정보만 가져옵니다.

CREATE OR REPLACE TABLE resultstate2 AS 
  (SELECT approx_percentile_accumulate(c1) AS rs1 
     FROM test_table2);
Copy

행의 두 배치에 대한 “상태” 정보를 결합합니다.

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

결합된 행 세트의 대략적인 중앙값을 가져옵니다.

SELECT approx_percentile_estimate(c1, 0.5) FROM combined_resultstate;
Copy

출력:

SELECT approx_percentile_estimate(c1, 0.5) FROM combined_resultstate;
+-------------------------------------+
| APPROX_PERCENTILE_ESTIMATE(C1, 0.5) |
|-------------------------------------|
|                                 4.5 |
+-------------------------------------+
Copy