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

quantileExact 精确分位数函数

quantileExact

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

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

在一个查询中使用多个具有不同分位等级的 quantile* 函数时,其内部状态不会被合并(也就是说,该查询的执行效率低于理论上可能达到的效率)。在这种情况下,请使用 quantiles 函数。

语法

quantileExact(level)(expr)

别名:medianExact

参数

  • level — 分位数的级别。可选参数。取值为 0 到 1 之间的常量浮点数。建议使用 [0.01, 0.99] 范围内的 level 值。默认值:0.5。当 level=0.5 时,函数计算中位数
  • expr — 作用于列值的表达式,其结果类型为数值型数据类型DateDateTime

返回值

  • 指定级别的分位数。

类型:

  • 对于数值数据类型,输出格式与输入格式相同。例如:

SELECT
    toTypeName(quantileExact(number)) AS `quantile`,
    toTypeName(quantileExact(number::Int32)) AS `quantile_int32`,
    toTypeName(quantileExact(number::Float32)) AS `quantile_float32`,
    toTypeName(quantileExact(number::Float64)) AS `quantile_float64`,
    toTypeName(quantileExact(number::Int64)) AS `quantile_int64`
FROM numbers(1)
   ┌─quantile─┬─quantile_int32─┬─quantile_float32─┬─quantile_float64─┬─quantile_int64─┐
1. │ UInt64   │ Int32          │ Float32          │ Float64          │ Int64          │
   └──────────┴────────────────┴──────────────────┴──────────────────┴────────────────┘

返回 1 行。耗时: 0.002 秒。
  • 如果输入值的类型为 Date,则为 Date
  • 如果输入值的类型为 DateTime,则为 DateTime

示例

查询:

SELECT quantileExact(number) FROM numbers(10)

结果:

┌─quantileExact(number)─┐
│                     5 │
└───────────────────────┘

quantileExactLow

quantileExact 类似,此函数计算数值数据序列的精确分位数

为了获得精确值,所有传入的值会先合并为一个数组,然后对该数组进行完全排序。排序算法的复杂度为 O(N·log(N)),其中 N = std::distance(first, last) 为元素个数。

返回值取决于分位数水平(level)和所选元素的数量。也就是说,如果 level 为 0.5,那么当元素个数为偶数时,函数返回较低的中位数值,当元素个数为奇数时返回中间的中位数值。中位数的计算方式与 Python 中使用的 median_low 实现类似。

对于其他任意 level,会返回索引为 level * size_of_array 的元素。例如:

SELECT quantileExactLow(0.1)(number) FROM numbers(10)

┌─quantileExactLow(0.1)(number)─┐
│                             1 │
└───────────────────────────────┘

在查询中使用多个分位数等级不同的 quantile* 函数时,其内部状态不会被合并(也就是说,查询的执行效率会低于理想水平)。在这种情况下,请使用 quantiles 函数。

语法

quantileExactLow(level)(expr)

别名:medianExactLow

参数

  • level — 分位水平。可选参数。取值为 0 到 1 之间的常量浮点数。推荐在 [0.01, 0.99] 范围内使用 level 值。默认值:0.5。当 level=0.5 时,函数计算中位数
  • expr — 对列值进行计算的表达式,结果为数值数据类型DateDateTime

返回值

  • 指定分位水平的分位数。

类型:

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

示例

查询:

SELECT quantileExactLow(number) FROM numbers(10)

结果:

┌─quantileExactLow(number)─┐
│                        4 │
└──────────────────────────┘

quantileExactHigh

quantileExact 类似,该函数计算数值数据序列的精确分位数

所有传入的值会合并到一个数组中,然后对该数组进行完全排序,以获得精确值。排序算法的复杂度为 O(N·log(N)),其中 N = std::distance(first, last) 为比较次数。

返回值取决于分位数水平(level)以及选定元素的数量。也就是说,如果 level 为 0.5,则当元素个数为偶数时,函数返回偏高的中位数值,当元素个数为奇数时,函数返回正中的中位数值。中位数的计算方式与 Python 中使用的 median_high 实现类似。对于其他所有 level,返回索引为 level * size_of_array 对应位置的元素。

该实现与当前的 quantileExact 实现的行为完全一致。

在一个查询中使用多个带有不同 level 的 quantile* 函数时,其内部状态不会被合并(也就是说,该查询的执行效率低于理论最优)。在这种情况下,请使用 quantiles 函数。

语法

quantileExactHigh(level)(expr)

别名:medianExactHigh

参数

  • level — 分位数水平。可选参数,从 0 到 1 的常量浮点数。建议在 [0.01, 0.99] 范围内使用 level 值。默认值:0.5。当 level = 0.5 时,该函数计算中位数
  • expr — 针对列值的表达式,结果为数值型数据类型DateDateTime

返回值

  • 指定水平的分位数。

类型:

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

示例

查询:

SELECT quantileExactHigh(number) FROM numbers(10)

结果:

┌─quantileExactHigh(number)─┐
│                         5 │
└───────────────────────────┘

quantileExactExclusive

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

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

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

在同一个查询中以不同分位点多次使用 quantileExactExclusive 函数时,其内部状态不会被合并(也就是说,该查询的执行效率会低于本可以达到的最优效率)。在这种情况下,请使用 quantilesExactExclusive 函数。

语法

quantileExactExclusive(level)(expr)

参数

参数说明

  • level — 分位数级别。可选。取值范围:(0, 1) — 不包含边界。默认值:0.5。当 level=0.5 时,该函数计算中位数。类型为 Float

返回值

  • 指定级别的分位数。

类型:

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

示例

查询:

CREATE TABLE num AS numbers(1000);

SELECT quantileExactExclusive(0.6)(x) FROM (SELECT number AS x FROM num);

结果:

┌─quantileExactExclusive(0.6)(x)─┐
│                          599.6 │
└────────────────────────────────┘

quantileExactInclusive

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

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

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

在同一个查询中使用多个具有不同 level 的 quantileExactInclusive 函数时,其内部状态不会被合并(即查询的执行效率低于理论上的最优)。在这种情况下,请使用 quantilesExactInclusive 函数。

语法

quantileExactInclusive(level)(expr)

参数

参数说明

  • level — 分位数级别。可选。取值范围为 [0, 1](包含边界)。默认值:0.5。当 level=0.5 时,函数计算中位数。类型为 Float

返回值

  • 指定级别的分位数。

类型:

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

示例

查询:

CREATE TABLE num AS numbers(1000);

SELECT quantileExactInclusive(0.6)(x) FROM (SELECT number AS x FROM num);

结果:

┌─quantileExactInclusive(0.6)(x)─┐
│                          599.4 │
└────────────────────────────────┘

另请参阅