跳转到主要内容

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(Float64)Array(Date)Array(DateTime) 示例 使用 GK 算法计算多个分位数
Query
SELECT quantilesGK(1, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);
Response
┌─quantilesGK(1, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [1, 1, 1]                                        │
└──────────────────────────────────────────────────┘
更高精度分位数
Query
SELECT quantilesGK(100, 0.25, 0.5, 0.75)(number + 1) FROM numbers(1000);
Response
┌─quantilesGK(100, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [251, 498, 741]                                    │
└────────────────────────────────────────────────────┘
最后修改于 2026年6月10日