类别:

聚合函数 (百分位估计)、窗口函数

APPROX_PERCENTILE_ACCUMULATE

在聚合结束时返回 T-Digest 状态(作为 JSON 对象)的内部表示。(有关 T-Digest 的更多信息,请参阅:估算百分位值

在返回最终百分位数估计值时,函数 APPROX_PERCENTILE 会丢弃此内部中间状态。但在某些高级用例中,例如在批量加载期间估计增量百分位数时,您可能希望保留中间状态,在这种情况下,可以使用 APPROX_PERCENTILE_ACCUMULATE,而非 APPROX_PERCENTILE

APPROX_PERCENTILE_ACCUMULATE 不会返回百分位数值。相反,它返回的是算法状态本身。中间状态稍后可为:

  • 与来自独立但相关的数据批次的其他中间状态相结合(即合并)。

  • 由直接作用于中间状态的其他函数处理,例如 APPROX_PERCENTILE_ESTIMATE。(有关示例,请参阅下面的“示例”部分。)

  • 导出到外部工具。

另请参阅:

APPROX_PERCENTILE_COMBINEAPPROX_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_ACCUMULATEAPPROX_PERCENTILE_ESTIMATEAPPROX_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

获取合并后的行集的近似 Top K 值:

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
语言: 中文