跳到主要内容
跳到主要内容

quantileGK

使用 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 — 分位数的精度。为正整数常量。精度值越大,误差越小。例如,如果将精度参数设置为 100,则计算得到的分位数在较高概率下误差不会超过 1%。计算得到的分位数精度与算法的计算复杂度之间存在权衡。更高的精度需要更多内存和计算资源来更准确地计算分位数,而较低的精度参数可以实现更快、更节省内存的计算,但精度会略有下降。

  • level — 分位数的级别。可选参数。取值为 0 到 1 之间的常量浮点数。默认值:0.5。当 level=0.5 时,函数计算中位数

  • expr — 针对列值进行运算的表达式,其结果为数值型数据类型DateDateTime

返回值

  • 指定级别和精度的分位数。

类型:

  • 对数值型输入数据类型,返回 Float64
  • 如果输入值的类型为 Date,返回 Date
  • 如果输入值的类型为 DateTime,返回 DateTime

示例

SELECT quantileGK(1, 0.25)(number + 1)
FROM numbers(1000)

┌─quantileGK(1, 0.25)(plus(number, 1))─┐
│                                    1 │
└──────────────────────────────────────┘

SELECT quantileGK(10, 0.25)(number + 1)
FROM numbers(1000)

┌─quantileGK(10, 0.25)(plus(number, 1))─┐
│                                   156 │
└───────────────────────────────────────┘

SELECT quantileGK(100, 0.25)(number + 1)
FROM numbers(1000)

┌─quantileGK(100, 0.25)(plus(number, 1))─┐
│                                    251 │
└────────────────────────────────────────┘

SELECT quantileGK(1000, 0.25)(number + 1)
FROM numbers(1000)

┌─quantileGK(1000, 0.25)(plus(number, 1))─┐
│                                     249 │
└─────────────────────────────────────────┘

另请参见

  • [median]/sql-reference/aggregate-functions/reference/median
  • quantiles