跳至主要内容

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
└─────────────────────────────────────────┘

另请参阅