Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

quantilesGK

quantilesGK

引入版本:v23.4.0

使用 Greenwald-Khanna 算法,同时计算数值数据序列在不同级别上的多个分位数

此函数与 quantileGK 的工作方式类似,但它支持在单次遍历中计算多个分位数级别,因此比分别调用单个分位数函数更高效。

Greenwald-Khanna 算法是一种以极高效率计算数据流分位数的算法。 该算法由 Michael Greenwald 和 Sanjeev Khanna 于 2001 年提出。 它非常高效,仅需 O(log n) 的空间,且每个条目的处理时间为 O(log log n) (其中 n 为输入大小) 。 它也具有很高的精度,能够以可控精度提供近似分位数值。

语法

quantilesGK(accuracy, level1, level2, ...)(expr)

参数

  • accuracy — 分位数精度。常量正整数。accuracy 值越大,误差越小。例如,如果 accuracy 参数设为 100,则计算出的分位数有很高概率将误差控制在 1% 以内。计算分位数的精度与算法的计算复杂度之间需要权衡。UInt*
  • level — 分位数级别。一个或多个介于 0 到 1 之间的常量浮点数。Float*

Arguments

返回值

按指定级别的顺序返回对应分位数的数组。对于数值数据类型,输出格式与输入格式一致。Array((U)Int*)Array(Int128)Array(UInt128)Array(Int256)Array(UInt256)Array(Float*)Array(Decimal*)Array(Date)Array(DateTime)Array(DateTime64)

示例

使用 GK 算法计算多个分位数

SELECT quantilesGK(1, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);
┌─quantilesGK(1, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [1,1,1]                                          │
└──────────────────────────────────────────────────┘

更高精度分位数

SELECT quantilesGK(100, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);
┌─quantilesGK(100, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [251,498,741]                                      │
└────────────────────────────────────────────────────┘
Navigation