跳转到主要内容

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*
参数 返回值 返回指定级别和精度的分位数。Float64DateDateTime 示例 计算不同精度级别的分位数
Query
SELECT quantileGK(1, 0.25)(number + 1) FROM numbers(1000);
Response
┌─quantileGK(1, 0.25)(plus(number, 1))─┐
│                                    1 │
└──────────────────────────────────────┘
更高精度分位数
Query
SELECT quantileGK(100, 0.25)(number + 1) FROM numbers(1000);
Response
┌─quantileGK(100, 0.25)(plus(number, 1))─┐
│                                    251 │
└────────────────────────────────────────┘
另请参见
最后修改于 2026年6月10日