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

分位数函数

quantiles

语法:quantiles(level1, level2, ...)(x)

所有分位数函数也都有对应的 quantiles 系列函数:quantilesquantilesDeterministicquantilesTimingquantilesTimingWeightedquantilesExactquantilesExactWeightedquantileExactWeightedInterpolatedquantileInterpolatedWeightedquantilesTDigestquantilesBFloat16quantilesDD。这些函数在一次遍历中计算出所列各个分位水平的所有分位数,并返回包含结果值的数组。

quantilesExactExclusive

精确计算数值数据序列的分位数

为了获得精确值,所有传入的值会被合并为一个数组,然后对该数组进行部分排序。因此,该函数会消耗 O(n) 的内存,其中 n 是传入值的数量。不过,在数据量较小时,该函数非常高效。

此函数等价于 Excel 中的 PERCENTILE.EXC 函数(R6 类型)。

在处理一组分位等级(levels)时,相比于 quantileExactExclusive,本函数效率更高。

语法

quantilesExactExclusive(level1, level2, ...)(expr)

参数

参数说明

  • level — 分位数的水平。可取值范围为 (0, 1),不包含端点。类型为 Float

返回值

  • 由指定水平的分位数组成的 Array

数组元素类型:

  • 对于数值型输入,数组元素类型为 Float64
  • 如果输入值类型为 Date,则为 Date
  • 如果输入值类型为 DateTime,则为 DateTime

示例

查询:

CREATE TABLE num AS numbers(1000);

SELECT quantilesExactExclusive(0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999)(x) FROM (SELECT number AS x FROM num);

结果:

┌─quantilesExactExclusive(0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999)(x)─┐
│ [249.25,499.5,749.75,899.9,949.9499999999999,989.99,998.999]        │
└─────────────────────────────────────────────────────────────────────┘

quantilesExactInclusive

精确计算数值数据序列的分位数

为了获得精确值,所有传入的值会被合并到一个数组中,然后对该数组进行部分排序。因此,该函数会消耗 O(n) 的内存,其中 n 是传入值的数量。不过,当传入值数量较少时,该函数非常高效。

此函数等价于 Excel 函数 PERCENTILE.INCR7 类型)。

在处理一组分位等级时,比 quantileExactInclusive 更高效。

语法

quantilesExactInclusive(level1, level2, ...)(expr)

参数说明

参数

  • level — 分位数的水平。可选值:[0, 1](包含边界)。Float

返回值

  • 一个包含指定水平分位数的 Array

数组元素类型:

  • 数值型输入时为 Float64
  • 输入值为 Date 类型时为 Date
  • 输入值为 DateTime 类型时为 DateTime

示例

查询:

CREATE TABLE num AS numbers(1000);

SELECT quantilesExactInclusive(0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999)(x) FROM (SELECT number AS x FROM num);

结果:

┌─quantilesExactInclusive(0.25, 0.5, 0.75, 0.9, 0.95, 0.99, 0.999)(x)─┐
│ [249.75,499.5,749.25,899.1,949.05,989.01,998.001]                   │
└─────────────────────────────────────────────────────────────────────┘

quantilesGK

quantilesGK 的工作方式与 quantileGK 类似,但它允许我们同时计算多个不同分位点的数值,并返回一个数组。

语法

quantilesGK(accuracy, level1, level2, ...)(expr)

返回值

  • 包含指定分位水平的数组

数组元素类型:

  • 数值类型输入时为 Float64
  • 如果输入值为 Date 类型,则为 Date
  • 如果输入值为 DateTime 类型,则为 DateTime

示例

查询:

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(10, 0.25, 0.5, 0.75)(number + 1)
FROM numbers(1000)

┌─quantilesGK(10, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [156,413,659]                                     │
└───────────────────────────────────────────────────┘
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]                                      │
└────────────────────────────────────────────────────┘

SELECT quantilesGK(1000, 0.25, 0.5, 0.75)(number + 1)
FROM numbers(1000)

┌─quantilesGK(1000, 0.25, 0.5, 0.75)(plus(number, 1))─┐
│ [249,499,749]                                       │
└─────────────────────────────────────────────────────┘