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
expr— 基于列值计算的表达式,结果为数值数据类型、Date、DateTime或DateTime64。(U)Int*或Int128或UInt128或Int256或UInt256或Float*或Decimal*或Date或DateTime或DateTime64
返回值
按指定级别的顺序返回对应分位数的数组。对于数值数据类型,输出格式与输入格式一致。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] │
└────────────────────────────────────────────────────┘