ClickHouse/docs/zh/sql-reference/aggregate-functions/reference.md
2021-03-25 17:09:19 +08:00

27 KiB
Raw Blame History

toc_priority toc_title
36 参考手册

参考手册

skewPop

计算的序列偏度

skewPop(expr)

参数

expr表达式 返回一个数字。

返回值

给定序列的偏度。类型 — Float64

示例

SELECT skewPop(value) FROM series_with_value_column

skewSamp

计算 样品偏度 的序列。

它表示随机变量的偏度的无偏估计,如果传递的值形成其样本。

skewSamp(expr)

参数

expr表达式 返回一个数字。

返回值

给定序列的偏度。 类型 — Float64. 如果 n <= 1 (n 是样本的大小),则该函数返回 nan.

示例

SELECT skewSamp(value) FROM series_with_value_column

uniqCombined

计算不同参数值的近似数量。

uniqCombined(HLL_precision)(x[, ...])

uniqCombined 函数是计算不同数值数量的不错选择。

参数

该函数采用可变数量的参数。 参数可以是 Tuple, Array, Date, DateTime, String,或数字类型。

HLL_precision 是以2为底的单元格数的对数 HyperLogLog. 可选,您可以将该函数用作 uniqCombined(x[, ...]). 默认值 HLL_precision 是17这是有效的96KiB的空间2^17个单元每个6比特

返回值

  • 一个UInt64类型的数字。

实现细节

功能:

  • 计算散列64位散列 String 否则32位对于聚合中的所有参数然后在计算中使用它。

  • 使用三种算法的组合数组、哈希表和包含错误修正表的HyperLogLog。

    少量的不同的值,使用数组。 值再多一些使用哈希表。对于大量的数据来说使用HyperLogLogHyperLogLog占用一个固定的内存空间。
    
  • 确定性地提供结果(它不依赖于查询处理顺序)。

!!! note "注" 因为它使用32位散列非-String 类型,结果将有非常高的误差基数显着大于 UINT_MAX (错误将在几百亿不同值之后迅速提高),因此在这种情况下,您应该使用 uniqCombined64

相比于 uniq 功能,该 uniqCombined:

  • 消耗少几倍的内存。
  • 计算精度高出几倍。
  • 通常具有略低的性能。 在某些情况下, uniqCombined 可以表现得比 uniq 好,例如,使用通过网络传输大量聚合状态的分布式查询。

另请参阅

uniqCombined64

uniqCombined但对所有数据类型使用64位哈希。

uniqHLL12

计算不同参数值的近似数量,使用 HyperLogLog 算法。

uniqHLL12(x[, ...])

参数

该函数采用可变数量的参数。 参数可以是 Tuple, Array, Date, DateTime, String,或数字类型。

返回值

实现细节

功能:

  • 计算聚合中所有参数的哈希值,然后在计算中使用它。

  • 使用HyperLogLog算法来近似不同参数值的数量。

    212 5-bit cells are used. The size of the state is slightly more than 2.5 KB. The result is not very accurate (up to ~10% error) for small data sets (<10K elements). However, the result is fairly accurate for high-cardinality data sets (10K-100M), with a maximum error of ~1.6%. Starting from 100M, the estimation error increases, and the function will return very inaccurate results for data sets with extremely high cardinality (1B+ elements).
    
  • 提供确定结果(它不依赖于查询处理顺序)。

我们不建议使用此功能。 在大多数情况下,使用 uniquniqCombined 功能。

另请参阅

uniqExact

计算不同参数值的准确数目。

uniqExact(x[, ...])

如果你绝对需要一个确切的结果,使用 uniqExact 功能。 否则使用 uniq 功能。

uniqExactuniq 使用更多的内存,因为状态的大小随着不同值的数量的增加而无界增长。

参数

该函数采用可变数量的参数。 参数可以是 Tuple, Array, Date, DateTime, String,或数字类型。

另请参阅

quantileExact

准确计算数字序列的分位数

为了准确计算,所有输入的数据被合并为一个数组,并且部分的排序。因此该函数需要 O(n) 的内存n为输入数据的个数。但是对于少量数据来说该函数还是非常有效的。

当在一个查询中使用多个不同层次的 quantile* 时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。

语法

quantileExact(level)(expr)

别名: medianExact.

参数

  • level — 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐 level 值的范围为 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。

返回值

  • 指定层次的分位数。

类型:

  • Float64 对于数字数据类型输入。
  • 日期 如果输入值具有 Date 类型。
  • 日期时间 如果输入值具有 DateTime 类型。

示例

查询:

SELECT quantileExact(number) FROM numbers(10)

结果:

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

另请参阅

quantileExactWeighted

考虑到每个元素的权重,然后准确计算数值序列的分位数

为了准确计算,所有输入的数据被合并为一个数组,并且部分的排序。每个输入值需要根据 weight 计算求和。该算法使用哈希表。正因为如此,在数据重复较多的时候使用的内存是少于quantileExact的。 您可以使用此函数代替 quantileExact 并指定重量1。

当在一个查询中使用多个不同层次的 quantile* 时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。

语法

quantileExactWeighted(level)(expr, weight)

别名: medianExactWeighted.

参数

  • level — 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐 level 值的范围为 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。
  • weight — 权重序列。 权重是一个数据出现的数值。

返回值

  • 指定层次的分位数。

类型:

  • Float64 对于数字数据类型输入。
  • 日期 如果输入值具有 Date 类型。
  • 日期时间 如果输入值具有 DateTime 类型。

示例

输入表:

┌─n─┬─val─┐
│ 0 │   3 │
│ 1 │   2 │
│ 2 │   1 │
│ 5 │   4 │
└───┴─────┘

查询:

SELECT quantileExactWeighted(n, val) FROM t

结果:

┌─quantileExactWeighted(n, val)─┐
│                             1 │
└───────────────────────────────┘

另请参阅

quantileTiming

使用确定的精度计算数字数据序列的分位数

结果是确定性的(它不依赖于查询处理顺序)。 该函数针对描述加载网页时间或后端响应时间等分布的序列进行了优化。

当在一个查询中使用多个不同层次的 quantile* 时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。

语法

quantileTiming(level)(expr)

别名: medianTiming.

参数

  • level — 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐 level 值的范围为 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.

  • expr表达式,返回 浮动*类型数据。

    - 如果输入负值,那结果是不可预期的。
    - 如果输入值大于30000页面加载时间大于30s那我们假设为30000。
    

精度

计算是准确的,如果:

  • 值的总数不超过5670。
  • 总数值超过5670但页面加载时间小于1024ms。

否则计算结果将四舍五入到16毫秒的最接近倍数。

!!! note "注" 对于计算页面加载时间分位数,此函数比 分位数更有效和准确。

返回值

  • 指定层次的分位数。

类型: Float32.

!!! note "注" 如果没有值传递给函数(当使用 quantileTimingIf), NaN 被返回。 这样做的目的是将这些案例与导致零的案例区分开来。 看 ORDER BY clause 对于 NaN 值排序注意事项。

示例

输入表:

┌─response_time─┐
│            72 │
│           112 │
│           126 │
│           145 │
│           104 │
│           242 │
│           313 │
│           168 │
│           108 │
└───────────────┘

查询:

SELECT quantileTiming(response_time) FROM t

结果:

┌─quantileTiming(response_time)─┐
│                           126 │
└───────────────────────────────┘

另请参阅

quantileTimingWeighted

根据每个序列成员的权重,使用确定的精度计算数字序列的分位数

结果是确定性的(它不依赖于查询处理顺序)。 该函数针对描述加载网页时间或后端响应时间等分布的序列进行了优化。

当在一个查询中使用多个不同层次的 quantile* 时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。

语法

quantileTimingWeighted(level)(expr, weight)

别名: medianTimingWeighted.

参数

  • level — 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐 level 值的范围为 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.

  • expr表达式,返回 浮动*类型数据。

    - 如果输入负值,那结果是不可预期的。
    - 如果输入值大于30000页面加载时间大于30s那我们假设为30000。
    
  • weight — 权重序列。 权重是一个数据出现的数值。

精度

计算是准确的,如果:

  • 值的总数不超过5670。
  • 总数值超过5670但页面加载时间小于1024ms。

否则计算结果将四舍五入到16毫秒的最接近倍数。

!!! note "注" 对于计算页面加载时间分位数,此函数比 分位数更高效和准确。

返回值

  • 指定层次的分位数。

类型: Float32.

!!! note "注" 如果没有值传递给函数(当使用 quantileTimingIf), NaN 被返回。 这样做的目的是将这些案例与导致零的案例区分开来。看 ORDER BY clause 对于 NaN 值排序注意事项。

示例

输入表:

┌─response_time─┬─weight─┐
│            68 │      1 │
│           104 │      2 │
│           112 │      3 │
│           126 │      2 │
│           138 │      1 │
│           162 │      1 │
└───────────────┴────────┘

查询:

SELECT quantileTimingWeighted(response_time, weight) FROM t

结果:

┌─quantileTimingWeighted(response_time, weight)─┐
│                                           112 │
└───────────────────────────────────────────────┘

另请参阅

quantileTDigest

使用t-digest 算法计算近似分位数

最大误差为1%。 内存消耗 log(n),这里 n 是值的个数。 结果取决于运行查询的顺序,并且是不确定的。

该功能的性能低于性能 分位数时间分位. 在状态大小与精度的比率方面,这个函数比 quantile更优秀。

当在一个查询中使用多个不同层次的 quantile* 时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能。

语法

quantileTDigest(level)(expr)

别名: medianTDigest.

参数

  • level — 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐 level 值的范围为 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。

回值

  • 指定层次的分位数。

类型:

  • Float64 对于数字数据类型输入。
  • 日期 如果输入值具有 Date 类型。
  • 日期时间 如果输入值具有 DateTime 类型。

示例

查询:

SELECT quantileTDigest(number) FROM numbers(10)

结果:

┌─quantileTDigest(number)─┐
│                     4.5 │
└─────────────────────────┘

另请参阅

quantileTDigestWeighted

使用t-digest 算法计算近似分位数。 该函数考虑了每个序列成员的权重。最大误差为1%。 内存消耗 log(n),这里 n 是值的个数。

该功能的性能低于性能 分位数时间分位. 在状态大小与精度的比率方面,这个函数比 quantile更优秀。

结果取决于运行查询的顺序,并且是不确定的。

当在一个查询中使用多个不同层次的 quantile* 时,内部状态不会被组合(即查询的工作效率低于组合情况)。在这种情况下,使用分位数功能

语法

quantileTDigest(level)(expr)

别名: medianTDigest.

参数

  • level — 分位数层次。可选参数。 从0到1的一个float类型的常量。 我们推荐 level 值的范围为 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — 求职表达式,类型为:数值数据类型,日期数据类型或时间数据类型。
  • weight — 权重序列。 权重是一个数据出现的数值。

返回值

  • 指定层次的分位数。

类型:

  • Float64 对于数字数据类型输入。
  • 日期 如果输入值具有 Date 类型。
  • 日期时间 如果输入值具有 DateTime 类型。

示例

查询:

SELECT quantileTDigestWeighted(number, 1) FROM numbers(10)

结果:

┌─quantileTDigestWeighted(number, 1)─┐
│                                4.5 │
└────────────────────────────────────┘

另请参阅

quantiles(level1, level2, …)(x)

所有分位数函数也有相应的函数: quantiles, quantilesDeterministic, quantilesTiming, quantilesTimingWeighted, quantilesExact, quantilesExactWeighted, quantilesTDigest。这些函数一次计算所列层次的所有分位数,并返回结果值的数组。

stddevSamp(x)

结果等于平方根 varSamp(x)

!!! note "注" 该函数使用数值不稳定的算法。 如果你需要 数值稳定性 在计算中,使用 stddevSampStable 功能。 它的工作速度较慢,但提供较低的计算错误。

stddevPop(x)

结果等于平方根 varPop(x)

!!! note "注" 该函数使用数值不稳定的算法。 如果你需要 数值稳定性 在计算中,使用 stddevPopStable 功能。 它的工作速度较慢,但提供较低的计算错误。

topK(N)(x)

返回指定列中近似最常见值的数组。 生成的数组按值的近似频率降序排序(而不是值本身)。

实现了过滤节省空间算法, 使用基于reduce-and-combine的算法借鉴并行节省空间.

topK(N)(column)

此函数不提供保证的结果。 在某些情况下,可能会发生错误,并且可能会返回不是最高频的值。

我们建议使用 N < 10 值,N 值越大,性能越低。最大值 N = 65536

参数

  • N 是要返回的元素数。

如果省略该参数则使用默认值10。

参数

  • ' x ' 计算的频率值。

示例

就拿 OnTime 数据集来说,选择AirlineID 列中出现最频繁的三个。

SELECT topK(3)(AirlineID) AS res
FROM ontime
┌─res─────────────────┐
│ [19393,19790,19805] │
└─────────────────────┘

topKWeighted

类似于 topK 但需要一个整数类型的附加参数 - weight. 每个输入都被记入 weight 次频率计算。

语法

topKWeighted(N)(x, weight)

参数

  • N — 返回值个数。

参数

  • x 输入值。
  • weight — 权重。 UInt8类型。

返回值

返回具有最大近似权重总和的值数组。

示例

查询:

SELECT topKWeighted(10)(number, number) FROM numbers(1000)

结果:

┌─topKWeighted(10)(number, number)──────────┐
│ [999,998,997,996,995,994,993,992,991,990] │
└───────────────────────────────────────────┘

stochasticLinearRegression

该函数实现随机线性回归。 它支持自定义参数的学习率、L2正则化系数、微批并且具有少量更新权重的方法Adam (默认), simple SGD Momentum Nesterov)。

参数

有4个可自定义的参数。 它们按顺序传递给函数,但是没有必要传递所有四个默认值将被使用,但是好的模型需要一些参数调整。

stochasticLinearRegression(1.0, 1.0, 10, 'SGD')
  1. learning rate 当执行梯度下降步骤时,步长上的系数。 过大的学习率可能会导致模型的权重无限大。 默认值为 0.00001.
  2. l2 regularization coefficient 这可能有助于防止过度拟合。 默认值为 0.1.
  3. mini-batch size 设置元素的数量,这些元素将被计算和求和以执行梯度下降的一个步骤。 纯随机下降使用一个元素但是具有小批量约10个元素使梯度步骤更稳定。 默认值为 15.
  4. method for updating weights 他们是: Adam (默认情况下), SGD, Momentum, Nesterov. MomentumNesterov 需要更多的计算和内存,但是它们恰好在收敛速度和随机梯度方法的稳定性方面是有用的。

用法

stochasticLinearRegression 用于两个步骤:拟合模型和预测新数据。 为了拟合模型并保存其状态以供以后使用,我们使用 -State combinator它基本上保存了状态模型权重等。 为了预测我们使用函数 evalMLMethod,这需要一个状态作为参数以及特征来预测。

1. 安装

可以使用这种查询。

CREATE TABLE IF NOT EXISTS train_data
(
    param1 Float64,
    param2 Float64,
    target Float64
) ENGINE = Memory;

CREATE TABLE your_model ENGINE = Memory AS SELECT
stochasticLinearRegressionState(0.1, 0.0, 5, 'SGD')(target, param1, param2)
AS state FROM train_data;

在这里,我们还需要将数据插入到 train_data 桌子 参数的数量不是固定的,它只取决于参数的数量,传递到 linearRegressionState. 它们都必须是数值。 请注意,带有目标值的列(我们想要学习预测)被插入作为第一个参数。

2. 预测

在将状态保存到表中之后,我们可以多次使用它进行预测,甚至与其他状态合并并创建新的更好的模型。

WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, param1, param2) FROM test_data

查询将返回一列预测值。 请注意,第一个参数 evalMLMethodAggregateFunctionState 对象,接下来是要素列。

test_data 是一个像表 train_data 但可能不包含目标值。

  1. 要合并两个模型,用户可以创建这样的查询: sql SELECT state1 + state2 FROM your_models 哪里 your_models 表包含这两个模型。 此查询将返回new AggregateFunctionState 对象。

  2. 如果没有,用户可以获取创建的模型的权重用于自己的目的,而不保存模型 -State 使用combinator。 sql SELECT stochasticLinearRegression(0.01)(target, param1, param2) FROM train_data 这种查询将拟合模型并返回其权重-首先是权重,它对应于模型的参数,最后一个是偏差。 所以在上面的例子中查询将返回一个具有3个值的列。

另请参阅

stochasticLogisticRegression

该函数实现随机逻辑回归。 它可以用于二进制分类问题支持与stochasticLinearRegression相同的自定义参数并以相同的方式工作。

参数

参数与stochasticLinearRegression中的参数完全相同: learning rate, l2 regularization coefficient, mini-batch size, method for updating weights. 欲了解更多信息,请参阅 参数.

stochasticLogisticRegression(1.0, 1.0, 10, 'SGD')

1. 安装

参考stochasticLinearRegression相关文档

预测标签的取值范围为[-1, 1]

2. 预测

使用已经保存的state我们可以预测标签为 `1` 的对象的概率。

``` sql
WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, param1, param2) FROM test_data
```

查询结果返回一个列的概率。注意 `evalMLMethod` 的第一个参数是 `AggregateFunctionState` 对象,接下来的参数是列的特性。

我们也可以设置概率的范围, 这样需要给元素指定不同的标签。

``` sql
SELECT ans < 1.1 AND ans > 0.5 FROM
(WITH (SELECT state FROM your_model) AS model SELECT
evalMLMethod(model, param1, param2) AS ans FROM test_data)
```

结果是标签。

`test_data` 是一个像 `train_data` 一样的表,但是不包含目标值。

另请参阅

原始文章