Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

quantileGK

quantileGK

引入版本:v23.4.0

使用 Greenwald-Khanna 算法计算数值数据序列的 分位数

Greenwald-Khanna 算法是一种能够以极高效率计算数据流分位数的算法。 该算法由 Michael Greenwald 和 Sanjeev Khanna 于 2001 年提出。 它广泛应用于数据库和大数据系统,尤其适用于需要对大规模数据流进行实时精确分位数计算的场景。 该算法非常高效,每处理一个数据项仅需 O(log n) 空间和 O(log log n) 时间 (其中 n 为输入大小) 。 它也具有很高的准确性,能够以较高概率给出近似分位数值。

quantileGK 与 ClickHouse 中的其他分位数函数不同,因为它允许用户控制近似分位数结果的精度。

语法

quantileGK(accuracy, level)(expr)

别名: medianGK

参数

  • accuracy — 分位数的精度。常量正整数。accuracy 值越大,误差越小。例如,如果 accuracy 参数设置为 100,则计算出的分位数有很高概率将误差控制在 1% 以内。计算结果的精度与算法复杂度之间需要权衡。较大的 accuracy 需要更多内存和计算资源,才能更精确地计算分位数;较小的 accuracy 则计算更快、更节省内存,但精度会略低一些。UInt*
  • level — 可选。分位数的级别。取值范围为 0 到 1 的常量浮点数。默认值:0.5。当 level=0.5 时,函数计算中位数。Float*

参数

返回值

返回指定级别和精度的分位数。对于数值数据类型,输出格式与输入格式一致。(U)Int*Int128UInt128Int256UInt256Float*Decimal*DateDateTimeDateTime64

示例

计算不同精度级别的分位数

SELECT quantileGK(1, 0.25)(number + 1) FROM numbers(1000);
┌─quantileGK(1, 0.25)(plus(number, 1))─┐
│                                    1 │
└──────────────────────────────────────┘

更高精度分位数

SELECT quantileGK(100, 0.25)(number + 1) FROM numbers(1000);
┌─quantileGK(100, 0.25)(plus(number, 1))─┐
│                                    251 │
└────────────────────────────────────────┘

另请参见

Navigation