跳转到主内容
跳转到主内容

quantilesGK

quantilesGK

引入版本:v23.4

使用 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 参数设置为 100,则计算出的分位数在较高概率下其误差不会超过 1%。分位数精度与算法计算复杂度之间存在折衷关系。UInt*
  • level — 分位数的级别。一个或多个从 0 到 1 的常量浮点数。Float*

参数

返回值

按指定顺序返回这些级别对应的分位数组成的数组。Array(Float64)Array(Date)Array(DateTime)

示例

使用 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]                                    │
└────────────────────────────────────────────────────┘