APPROX_PERCENTILE_ACCUMULATE¶
在聚合结束时返回 T-Digest 状态(作为 JSON 对象)的内部表示。(有关 T-Digest 的更多信息,请参阅:估算百分位值。
在返回最终百分位数估计值时,函数 APPROX_PERCENTILE 会丢弃此内部中间状态。但在某些高级用例中,例如在批量加载期间估计增量百分位数时,您可能希望保留中间状态,在这种情况下,可以使用 APPROX_PERCENTILE_ACCUMULATE
,而非 APPROX_PERCENTILE。
APPROX_PERCENTILE_ACCUMULATE
不会返回百分位数值。相反,它返回的是算法状态本身。中间状态稍后可为:
与来自独立但相关的数据批次的其他中间状态相结合(即合并)。
由直接作用于中间状态的其他函数处理,例如 APPROX_PERCENTILE_ESTIMATE。(有关示例,请参阅下面的“示例”部分。)
导出到外部工具。
语法¶
APPROX_PERCENTILE_ACCUMULATE( <expr> )
实参¶
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;
以下提供了更广泛的示例。这个示例展示了全部三个相关函数的用法: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);创建一个包含“状态”的表,该“状态”表示名为 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;输出:
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 data. 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 ) ;获取合并后的行集的近似 Top K 值:
SELECT approx_percentile_estimate(c1, 0.5) FROM combined_resultstate;输出:
SELECT approx_percentile_estimate(c1, 0.5) FROM combined_resultstate; +-------------------------------------+ | APPROX_PERCENTILE_ESTIMATE(C1, 0.5) | |-------------------------------------| | 4.5 | +-------------------------------------+