ClickHouse/docs/zh/sql-reference/aggregate-functions/reference.md
Ivan Blinkov cd14f9ebcb
SQL reference refactoring (#10857)
* split up select.md

* array-join.md basic refactoring

* distinct.md basic refactoring

* format.md basic refactoring

* from.md basic refactoring

* group-by.md basic refactoring

* having.md basic refactoring

* additional index.md refactoring

* into-outfile.md basic refactoring

* join.md basic refactoring

* limit.md basic refactoring

* limit-by.md basic refactoring

* order-by.md basic refactoring

* prewhere.md basic refactoring

* adjust operators/index.md links

* adjust sample.md links

* adjust more links

* adjust operatots links

* fix some links

* adjust aggregate function article titles

* basic refactor of remaining select clauses

* absolute paths in make_links.sh

* run make_links.sh

* remove old select.md locations

* translate docs/es

* translate docs/fr

* translate docs/fa

* remove old operators.md location

* change operators.md links

* adjust links in docs/es

* adjust links in docs/es

* minor texts adjustments

* wip

* update machine translations to use new links

* fix changelog

* es build fixes

* get rid of some select.md links

* temporary adjust ru links

* temporary adjust more ru links

* improve curly brace handling

* adjust ru as well

* fa build fix

* ru link fixes

* zh link fixes

* temporary disable part of anchor checks
2020-05-15 07:34:54 +03:00

63 KiB
Raw Blame History

machine_translated machine_translated_rev toc_priority toc_title
true 72537a2d52 36 参考资料

聚合函数引用

计数

计数行数或非空值。

ClickHouse支持以下语法 count:

  • count(expr)COUNT(DISTINCT expr).
  • count()COUNT(*). 该 count() 语法是ClickHouse特定的。

参数

该功能可以采取:

返回值

  • 如果没有参数调用函数,它会计算行数。
  • 如果 表达式 被传递则该函数计数此表达式返回的次数非null。 如果表达式返回 可为空-键入值,然后结果 count 保持不 Nullable. 如果返回表达式则该函数返回0 NULL 对于所有的行。

在这两种情况下,返回值的类型为 UInt64.

详细信息

ClickHouse支持 COUNT(DISTINCT ...) 语法 这种结构的行为取决于 count_distinct_implementation 设置。 它定义了其中的 uniq* 函数用于执行操作。 默认值为 uniqExact 功能。

SELECT count() FROM table 查询未被优化,因为表中的条目数没有单独存储。 它从表中选择一个小列并计算其中的值数。

示例1:

SELECT count() FROM t
┌─count()─┐
│       5 │
└─────────┘

示例2:

SELECT name, value FROM system.settings WHERE name = 'count_distinct_implementation'
┌─name──────────────────────────┬─value─────┐
│ count_distinct_implementation │ uniqExact │
└───────────────────────────────┴───────────┘
SELECT count(DISTINCT num) FROM t
┌─uniqExact(num)─┐
│              3 │
└────────────────┘

这个例子表明 count(DISTINCT num) 由执行 uniqExact 根据功能 count_distinct_implementation 设定值。

任何(x)

选择第一个遇到的值。 查询可以以任何顺序执行,甚至每次都以不同的顺序执行,因此此函数的结果是不确定的。 要获得确定的结果,您可以使用 minmax 功能,而不是 any.

在某些情况下,可以依靠执行的顺序。 这适用于SELECT来自使用ORDER BY的子查询的情况。

当一个 SELECT 查询具有 GROUP BY 子句或至少一个聚合函数ClickHouse相对于MySQL要求在所有表达式 SELECT, HAVING,和 ORDER BY 子句可以从键或聚合函数计算。 换句话说,从表中选择的每个列必须在键或聚合函数内使用。 要获得像MySQL这样的行为您可以将其他列放在 any 聚合函数。

anyHeavy(x)

使用选择一个频繁出现的值 重打者 算法。 如果某个值在查询的每个执行线程中出现的情况超过一半,则返回此值。 通常情况下,结果是不确定的。

anyHeavy(column)

参数

  • column The column name.

示例

就拿 时间 数据集,并选择在任何频繁出现的值 AirlineID 列。

SELECT anyHeavy(AirlineID) AS res
FROM ontime
┌───res─┐
│ 19690 │
└───────┘

anyLast(x)

选择遇到的最后一个值。 其结果是一样不确定的 any 功能。

集团比特

按位应用 AND 对于一系列的数字。

groupBitAnd(expr)

参数

expr An expression that results in UInt* 类型。

返回值

的价值 UInt* 类型。

示例

测试数据:

binary     decimal
00101100 = 44
00011100 = 28
00001101 = 13
01010101 = 85

查询:

SELECT groupBitAnd(num) FROM t

哪里 num 是包含测试数据的列。

结果:

binary     decimal
00000100 = 4

groupBitOr

按位应用 OR 对于一系列的数字。

groupBitOr(expr)

参数

expr An expression that results in UInt* 类型。

返回值

的价值 UInt* 类型。

示例

测试数据:

binary     decimal
00101100 = 44
00011100 = 28
00001101 = 13
01010101 = 85

查询:

SELECT groupBitOr(num) FROM t

哪里 num 是包含测试数据的列。

结果:

binary     decimal
01111101 = 125

groupBitXor

按位应用 XOR 对于一系列的数字。

groupBitXor(expr)

参数

expr An expression that results in UInt* 类型。

返回值

的价值 UInt* 类型。

示例

测试数据:

binary     decimal
00101100 = 44
00011100 = 28
00001101 = 13
01010101 = 85

查询:

SELECT groupBitXor(num) FROM t

哪里 num 是包含测试数据的列。

结果:

binary     decimal
01101000 = 104

groupBitmap

从无符号整数列的位图或聚合计算返回UInt64类型的基数如果添加后缀状态则返回 位图对象.

groupBitmap(expr)

参数

expr An expression that results in UInt* 类型。

返回值

的价值 UInt64 类型。

示例

测试数据:

UserID
1
1
2
3

查询:

SELECT groupBitmap(UserID) as num FROM t

结果:

num
3

min(x)

计算最小值。

max(x)

计算最大值。

argMin(arg,val)

计算 arg 最小值的值 val 价值。 如果有几个不同的值 arg 对于最小值 val遇到的第一个值是输出。

示例:

┌─user─────┬─salary─┐
│ director │   5000 │
│ manager  │   3000 │
│ worker   │   1000 │
└──────────┴────────┘
SELECT argMin(user, salary) FROM salary
┌─argMin(user, salary)─┐
│ worker               │
└──────────────────────┘

argMax(arg,val)

计算 arg 最大值 val 价值。 如果有几个不同的值 arg 对于最大值 val遇到的第一个值是输出。

sum(x)

计算总和。 只适用于数字。

sumWithOverflow(x)

使用与输入参数相同的数据类型计算数字的总和。 如果总和超过此数据类型的最大值,则函数返回错误。

只适用于数字。

sumMap(key,value),sumMap(Tuple(key,value))

总计 value 数组根据在指定的键 key 阵列。 传递键和值数组的元组与传递两个键和值数组是同义的。 元素的数量 keyvalue 总计的每一行必须相同。 Returns a tuple of two arrays: keys in sorted order, and values summed for the corresponding keys.

示例:

CREATE TABLE sum_map(
    date Date,
    timeslot DateTime,
    statusMap Nested(
        status UInt16,
        requests UInt64
    ),
    statusMapTuple Tuple(Array(Int32), Array(Int32))
) ENGINE = Log;
INSERT INTO sum_map VALUES
    ('2000-01-01', '2000-01-01 00:00:00', [1, 2, 3], [10, 10, 10], ([1, 2, 3], [10, 10, 10])),
    ('2000-01-01', '2000-01-01 00:00:00', [3, 4, 5], [10, 10, 10], ([3, 4, 5], [10, 10, 10])),
    ('2000-01-01', '2000-01-01 00:01:00', [4, 5, 6], [10, 10, 10], ([4, 5, 6], [10, 10, 10])),
    ('2000-01-01', '2000-01-01 00:01:00', [6, 7, 8], [10, 10, 10], ([6, 7, 8], [10, 10, 10]));

SELECT
    timeslot,
    sumMap(statusMap.status, statusMap.requests),
    sumMap(statusMapTuple)
FROM sum_map
GROUP BY timeslot
┌────────────timeslot─┬─sumMap(statusMap.status, statusMap.requests)─┬─sumMap(statusMapTuple)─────────┐
│ 2000-01-01 00:00:00 │ ([1,2,3,4,5],[10,10,20,10,10])               │ ([1,2,3,4,5],[10,10,20,10,10]) │
│ 2000-01-01 00:01:00 │ ([4,5,6,7,8],[10,10,20,10,10])               │ ([4,5,6,7,8],[10,10,20,10,10]) │
└─────────────────────┴──────────────────────────────────────────────┴────────────────────────────────┘

skewPop

计算 歪斜 的序列。

skewPop(expr)

参数

expr表达式 返回一个数字。

返回值

The skewness of the given distribution. Type — Float64

示例

SELECT skewPop(value) FROM series_with_value_column

skewSamp

计算 样品偏度 的序列。

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

skewSamp(expr)

参数

expr表达式 返回一个数字。

返回值

The skewness of the given distribution. Type — Float64. 如果 n <= 1 (n 是样本的大小),则该函数返回 nan.

示例

SELECT skewSamp(value) FROM series_with_value_column

kurtPop

计算 峰度 的序列。

kurtPop(expr)

参数

expr表达式 返回一个数字。

返回值

The kurtosis of the given distribution. Type — Float64

示例

SELECT kurtPop(value) FROM series_with_value_column

kurtSamp

计算 峰度样本 的序列。

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

kurtSamp(expr)

参数

expr表达式 返回一个数字。

返回值

The kurtosis of the given distribution. Type — Float64. 如果 n <= 1 (n 是样本的大小),则该函数返回 nan.

示例

SELECT kurtSamp(value) FROM series_with_value_column

timeSeriesGroupSum(uid,timestamp,value)

timeSeriesGroupSum 可以聚合不同的时间序列,即采样时间戳不对齐。 它将在两个采样时间戳之间使用线性插值,然后将时间序列和在一起。

  • uid 是时间序列唯一id, UInt64.
  • timestamp 是Int64型以支持毫秒或微秒。
  • value 是指标。

函数返回元组数组 (timestamp, aggregated_value) 对。

在使用此功能之前,请确保 timestamp 按升序排列

示例:

┌─uid─┬─timestamp─┬─value─┐
│ 1   │     2     │   0.2 │
│ 1   │     7     │   0.7 │
│ 1   │    12     │   1.2 │
│ 1   │    17     │   1.7 │
│ 1   │    25     │   2.5 │
│ 2   │     3     │   0.6 │
│ 2   │     8     │   1.6 │
│ 2   │    12     │   2.4 │
│ 2   │    18     │   3.6 │
│ 2   │    24     │   4.8 │
└─────┴───────────┴───────┘
CREATE TABLE time_series(
    uid       UInt64,
    timestamp Int64,
    value     Float64
) ENGINE = Memory;
INSERT INTO time_series VALUES
    (1,2,0.2),(1,7,0.7),(1,12,1.2),(1,17,1.7),(1,25,2.5),
    (2,3,0.6),(2,8,1.6),(2,12,2.4),(2,18,3.6),(2,24,4.8);

SELECT timeSeriesGroupSum(uid, timestamp, value)
FROM (
    SELECT * FROM time_series order by timestamp ASC
);

其结果将是:

[(2,0.2),(3,0.9),(7,2.1),(8,2.4),(12,3.6),(17,5.1),(18,5.4),(24,7.2),(25,2.5)]

timeSeriesGroupRateSum(uid,ts,val)

同样 timeSeriesGroupSum, timeSeriesGroupRateSum 计算时间序列的速率,然后将速率总和在一起。 此外,使用此函数之前,时间戳应该是上升顺序。

应用此功能从数据 timeSeriesGroupSum 例如,您将得到以下结果:

[(2,0),(3,0.1),(7,0.3),(8,0.3),(12,0.3),(17,0.3),(18,0.3),(24,0.3),(25,0.1)]

avg(x)

计算平均值。 只适用于数字。 结果总是Float64。

平均加权

计算 加权算术平均值.

语法

avgWeighted(x, weight)

参数

类型 xweight 一定是一样的

返回值

  • 加权平均值。
  • NaN. 如果所有的权重都等于0。

类型: Float64.

示例

查询:

SELECT avgWeighted(x, w)
FROM values('x Int8, w Int8', (4, 1), (1, 0), (10, 2))

结果:

┌─avgWeighted(x, weight)─┐
│                      8 │
└────────────────────────┘

uniq

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

uniq(x[, ...])

参数

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

返回值

实施细节

功能:

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

  • 使用自适应采样算法。 对于计算状态该函数使用最多65536个元素哈希值的样本。

    This algorithm is very accurate and very efficient on the CPU. When the query contains several of these functions, using `uniq` is almost as fast as using other aggregate functions.
    
  • 确定性地提供结果(它不依赖于查询处理顺序)。

我们建议在几乎所有情况下使用此功能。

另请参阅

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与error错表。

    For a small number of distinct elements, an array is used. When the set size is larger, a hash table is used. For a larger number of elements, HyperLogLog is used, which will occupy a fixed amount of memory.
    
  • 确定性地提供结果(它不依赖于查询处理顺序)。

!!! 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 功能。

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

参数

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

另请参阅

群交(x),群交(max_size)(x)

创建参数值的数组。 值可以按任何(不确定)顺序添加到数组中。

第二个版本(与 max_size 参数)将结果数组的大小限制为 max_size 元素。 例如, groupArray (1) (x) 相当于 [any (x)].

在某些情况下,您仍然可以依靠执行的顺序。 这适用于以下情况 SELECT 来自使用 ORDER BY.

groupArrayInsertAt

在指定位置向数组中插入一个值。

语法

groupArrayInsertAt(default_x, size)(x, pos);

如果在一个查询中将多个值插入到同一位置,则该函数的行为方式如下:

  • 如果在单个线程中执行查询,则使用第一个插入的值。
  • 如果在多个线程中执行查询,则结果值是未确定的插入值之一。

参数

  • x — Value to be inserted. 表达式 导致的一个 支持的数据类型.
  • pos — Position at which the specified element x 将被插入。 数组中的索引编号从零开始。 UInt32.
  • default_x— Default value for substituting in empty positions. Optional parameter. 表达式 导致为配置的数据类型 x 参数。 如果 default_x 未定义,则 默认值 被使用。
  • size— Length of the resulting array. Optional parameter. When using this parameter, the default value default_x 必须指定。 UInt32.

返回值

  • 具有插入值的数组。

类型: 阵列.

示例

查询:

SELECT groupArrayInsertAt(toString(number), number * 2) FROM numbers(5);

结果:

┌─groupArrayInsertAt(toString(number), multiply(number, 2))─┐
│ ['0','','1','','2','','3','','4']                         │
└───────────────────────────────────────────────────────────┘

查询:

SELECT groupArrayInsertAt('-')(toString(number), number * 2) FROM numbers(5);

结果:

┌─groupArrayInsertAt('-')(toString(number), multiply(number, 2))─┐
│ ['0','-','1','-','2','-','3','-','4']                          │
└────────────────────────────────────────────────────────────────┘

查询:

SELECT groupArrayInsertAt('-', 5)(toString(number), number * 2) FROM numbers(5);

结果:

┌─groupArrayInsertAt('-', 5)(toString(number), multiply(number, 2))─┐
│ ['0','-','1','-','2']                                             │
└───────────────────────────────────────────────────────────────────┘

元件的多线程插入到一个位置。

查询:

SELECT groupArrayInsertAt(number, 0) FROM numbers_mt(10) SETTINGS max_block_size = 1;

作为这个查询的结果,你会得到随机整数 [0,9] 范围。 例如:

┌─groupArrayInsertAt(number, 0)─┐
│ [7]                           │
└───────────────────────────────┘

groupArrayMovingSum

计算输入值的移动和。

groupArrayMovingSum(numbers_for_summing)
groupArrayMovingSum(window_size)(numbers_for_summing)

该函数可以将窗口大小作为参数。 如果未指定,则该函数的窗口大小等于列中的行数。

参数

  • numbers_for_summing表达式 生成数值数据类型值。
  • window_size — Size of the calculation window.

返回值

  • 与输入数据大小和类型相同的数组。

示例

样品表:

CREATE TABLE t
(
    `int` UInt8,
    `float` Float32,
    `dec` Decimal32(2)
)
ENGINE = TinyLog
┌─int─┬─float─┬──dec─┐
│   1 │   1.1 │ 1.10 │
│   2 │   2.2 │ 2.20 │
│   4 │   4.4 │ 4.40 │
│   7 │  7.77 │ 7.77 │
└─────┴───────┴──────┘

查询:

SELECT
    groupArrayMovingSum(int) AS I,
    groupArrayMovingSum(float) AS F,
    groupArrayMovingSum(dec) AS D
FROM t
┌─I──────────┬─F───────────────────────────────┬─D──────────────────────┐
│ [1,3,7,14] │ [1.1,3.3000002,7.7000003,15.47] │ [1.10,3.30,7.70,15.47] │
└────────────┴─────────────────────────────────┴────────────────────────┘
SELECT
    groupArrayMovingSum(2)(int) AS I,
    groupArrayMovingSum(2)(float) AS F,
    groupArrayMovingSum(2)(dec) AS D
FROM t
┌─I──────────┬─F───────────────────────────────┬─D──────────────────────┐
│ [1,3,6,11] │ [1.1,3.3000002,6.6000004,12.17] │ [1.10,3.30,6.60,12.17] │
└────────────┴─────────────────────────────────┴────────────────────────┘

groupArrayMovingAvg

计算输入值的移动平均值。

groupArrayMovingAvg(numbers_for_summing)
groupArrayMovingAvg(window_size)(numbers_for_summing)

该函数可以将窗口大小作为参数。 如果未指定,则该函数的窗口大小等于列中的行数。

参数

  • numbers_for_summing表达式 生成数值数据类型值。
  • window_size — Size of the calculation window.

返回值

  • 与输入数据大小和类型相同的数组。

该函数使用 四舍五入到零. 它截断结果数据类型的小数位数。

示例

样品表 b:

CREATE TABLE t
(
    `int` UInt8,
    `float` Float32,
    `dec` Decimal32(2)
)
ENGINE = TinyLog
┌─int─┬─float─┬──dec─┐
│   1 │   1.1 │ 1.10 │
│   2 │   2.2 │ 2.20 │
│   4 │   4.4 │ 4.40 │
│   7 │  7.77 │ 7.77 │
└─────┴───────┴──────┘

查询:

SELECT
    groupArrayMovingAvg(int) AS I,
    groupArrayMovingAvg(float) AS F,
    groupArrayMovingAvg(dec) AS D
FROM t
┌─I─────────┬─F───────────────────────────────────┬─D─────────────────────┐
│ [0,0,1,3] │ [0.275,0.82500005,1.9250001,3.8675] │ [0.27,0.82,1.92,3.86] │
└───────────┴─────────────────────────────────────┴───────────────────────┘
SELECT
    groupArrayMovingAvg(2)(int) AS I,
    groupArrayMovingAvg(2)(float) AS F,
    groupArrayMovingAvg(2)(dec) AS D
FROM t
┌─I─────────┬─F────────────────────────────────┬─D─────────────────────┐
│ [0,1,3,5] │ [0.55,1.6500001,3.3000002,6.085] │ [0.55,1.65,3.30,6.08] │
└───────────┴──────────────────────────────────┴───────────────────────┘

禄,赂麓ta脌麓,):脡,,拢脢,group媒group)galaxy s8碌胫脢)禄煤)酶脱脩)

从不同的参数值创建一个数组。 内存消耗是一样的 uniqExact 功能。

第二个版本(与 max_size 参数)将结果数组的大小限制为 max_size 元素。 例如, groupUniqArray(1)(x) 相当于 [any(x)].

分位数

计算近似值 分位数 的数字数据序列。

此功能适用 油藏采样 随着储存器大小高达8192和随机数发生器进行采样。 结果是非确定性的。 要获得精确的分位数,请使用 quantileExact 功能。

当使用多个 quantile* 在查询中具有不同级别的函数,内部状态不会被组合(即查询的工作效率低于它可以)。 在这种情况下,使用 分位数 功能。

语法

quantile(level)(expr)

别名: median.

参数

  • level — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a level 值的范围 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — Expression over the column values resulting in numeric 数据类型, 日期日期时间.

返回值

  • 指定电平的近似分位数。

类型:

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

示例

输入表:

┌─val─┐
│   1 │
│   1 │
│   2 │
│   3 │
└─────┘

查询:

SELECT quantile(val) FROM t

结果:

┌─quantile(val)─┐
│           1.5 │
└───────────────┘

另请参阅

量化确定

计算近似值 分位数 的数字数据序列。

此功能适用 油藏采样 与储层大小高达8192和采样的确定性算法。 结果是确定性的。 要获得精确的分位数,请使用 quantileExact 功能。

当使用多个 quantile* 在查询中具有不同级别的函数,内部状态不会被组合(即查询的工作效率低于它可以)。 在这种情况下,使用 分位数 功能。

语法

quantileDeterministic(level)(expr, determinator)

别名: medianDeterministic.

参数

  • level — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a level 值的范围 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — Expression over the column values resulting in numeric 数据类型, 日期日期时间.
  • determinator — Number whose hash is used instead of a random number generator in the reservoir sampling algorithm to make the result of sampling deterministic. As a determinator you can use any deterministic positive number, for example, a user id or an event id. If the same determinator value occures too often, the function works incorrectly.

返回值

  • 指定电平的近似分位数。

类型:

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

示例

输入表:

┌─val─┐
│   1 │
│   1 │
│   2 │
│   3 │
└─────┘

查询:

SELECT quantileDeterministic(val, 1) FROM t

结果:

┌─quantileDeterministic(val, 1)─┐
│                           1.5 │
└───────────────────────────────┘

另请参阅

quantileExact

正是计算 分位数 的数字数据序列。

To get exact value, all the passed values are combined into an array, which is then partially sorted. Therefore, the function consumes O(n) 内存,其中 n 是传递的多个值。 然而,对于少量的值,该函数是非常有效的。

当使用多个 quantile* 在查询中具有不同级别的函数,内部状态不会被组合(即查询的工作效率低于它可以)。 在这种情况下,使用 分位数 功能。

语法

quantileExact(level)(expr)

别名: medianExact.

参数

  • level — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a level 值的范围 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — Expression over the column values resulting in numeric 数据类型, 日期日期时间.

返回值

  • 指定电平的分位数。

类型:

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

示例

查询:

SELECT quantileExact(number) FROM numbers(10)

结果:

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

另请参阅

分位数加权

正是计算 分位数 数值数据序列,考虑到每个元素的权重。

To get exact value, all the passed values are combined into an array, which is then partially sorted. Each value is counted with its weight, as if it is present weight times. A hash table is used in the algorithm. Because of this, if the passed values are frequently repeated, the function consumes less RAM than quantileExact. 您可以使用此功能,而不是 quantileExact 并指定重量1。

当使用多个 quantile* 在查询中具有不同级别的函数,内部状态不会被组合(即查询的工作效率低于它可以)。 在这种情况下,使用 分位数 功能。

语法

quantileExactWeighted(level)(expr, weight)

别名: medianExactWeighted.

参数

  • level — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a level 值的范围 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — Expression over the column values resulting in numeric 数据类型, 日期日期时间.
  • weight — Column with weights of sequence members. Weight is a number of value occurrences.

返回值

  • 指定电平的分位数。

类型:

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

示例

输入表:

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

查询:

SELECT quantileExactWeighted(n, val) FROM t

结果:

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

另请参阅

分位定时

随着确定的精度计算 分位数 的数字数据序列。

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

当使用多个 quantile* 在查询中具有不同级别的函数,内部状态不会被组合(即查询的工作效率低于它可以)。 在这种情况下,使用 分位数 功能。

语法

quantileTiming(level)(expr)

别名: medianTiming.

参数

  • level — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a level 值的范围 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.

  • expr表达式 在一个列值返回 浮动*-键入号码。

    - If negative values are passed to the function, the behavior is undefined.
    - If the value is greater than 30,000 (a page loading time of more than 30 seconds), it is assumed to be 30,000.
    

精度

计算是准确的,如果:

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

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

!!! note "注" 对于计算页面加载时间分位数,此函数比 分位数.

返回值

  • 指定电平的分位数。

类型: Float32.

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

示例

输入表:

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

查询:

SELECT quantileTiming(response_time) FROM t

结果:

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

另请参阅

分位时间加权

随着确定的精度计算 分位数 根据每个序列成员的权重对数字数据序列进行处理。

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

当使用多个 quantile* 在查询中具有不同级别的函数,内部状态不会被组合(即查询的工作效率低于它可以)。 在这种情况下,使用 分位数 功能。

语法

quantileTimingWeighted(level)(expr, weight)

别名: medianTimingWeighted.

参数

  • level — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a level 值的范围 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.

  • expr表达式 在一个列值返回 浮动*-键入号码。

    - If negative values are passed to the function, the behavior is undefined.
    - If the value is greater than 30,000 (a page loading time of more than 30 seconds), it is assumed to be 30,000.
    
  • weight — Column with weights of sequence elements. Weight is a number of value occurrences.

精度

计算是准确的,如果:

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

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

!!! note "注" 对于计算页面加载时间分位数,此函数比 分位数.

返回值

  • 指定电平的分位数。

类型: Float32.

!!! note "注" 如果没有值传递给函数(当使用 quantileTimingIf), 阿南 被返回。 这样做的目的是将这些案例与导致零的案例区分开来。 看 按条款订购 对于排序注意事项 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 — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a level 值的范围 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — Expression over the column values resulting in numeric 数据类型, 日期日期时间.

回值

  • 指定电平的近似分位数。

类型:

  • 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 — Level of quantile. Optional parameter. Constant floating-point number from 0 to 1. We recommend using a level 值的范围 [0.01, 0.99]. 默认值0.5。 在 level=0.5 该函数计算 中位数.
  • expr — Expression over the column values resulting in numeric 数据类型, 日期日期时间.
  • weight — Column with weights of sequence elements. Weight is a number of value occurrences.

返回值

  • 指定电平的近似分位数。

类型:

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

示例

查询:

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

结果:

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

另请参阅

中位数

median* 函数是相应的别名 quantile* 功能。 它们计算数字数据样本的中位数。

功能:

示例

输入表:

┌─val─┐
│   1 │
│   1 │
│   2 │
│   3 │
└─────┘

查询:

SELECT medianDeterministic(val, 1) FROM t

结果:

┌─medianDeterministic(val, 1)─┐
│                         1.5 │
└─────────────────────────────┘

quantiles(level1, level2, …)(x)

所有分位数函数也具有相应的分位数函数: quantiles, quantilesDeterministic, quantilesTiming, quantilesTimingWeighted, quantilesExact, quantilesExactWeighted, quantilesTDigest. 这些函数在一遍中计算所列电平的所有分位数,并返回结果值的数组。

varSamp(x)

计算金额 Σ((x - x̅)^2) / (n - 1),哪里 n 是样本大小和 是平均值 x.

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

返回 Float64. 当 n <= 1,返回 +∞.

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

varPop(x)

计算金额 Σ((x - x̅)^2) / n,哪里 n 是样本大小和 是平均值 x.

换句话说,分散为一组值。 返回 Float64.

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

stddevSamp(x)

结果等于平方根 varSamp(x).

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

stddevPop(x)

结果等于平方根 varPop(x).

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

topK(N)(x)

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

实现了 过滤节省空间 基于reduce-and-combine算法的TopK分析算法 并行节省空间.

topK(N)(column)

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

我们建议使用 N < 10 值;性能降低了大 N 值。 的最大值 N = 65536.

参数

  • N 是要返回的元素数。

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

参数

  • ' x ' The value to calculate frequency.

示例

就拿 时间 数据集,并选择在三个最频繁出现的值 AirlineID 列。

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

topKWeighted

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

语法

topKWeighted(N)(x, weight)

参数

  • N — The number of elements to return.

参数

  • x The value.
  • weight — The weight. UInt8.

返回值

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

示例

查询:

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

结果:

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

covarSamp(x,y)

计算的值 Σ((x - x̅)(y - y̅)) / (n - 1).

返回Float64。 当 n <= 1, returns +∞.

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

covarPop(x,y)

计算的值 Σ((x - x̅)(y - y̅)) / n.

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

corr(x,y)

计算Pearson相关系数: Σ((x - x̅)(y - y̅)) / sqrt(Σ((x - x̅)^2) * Σ((y - y̅)^2)).

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

categoricalInformationValue

计算的值 (P(tag = 1) - P(tag = 0))(log(P(tag = 1)) - log(P(tag = 0))) 对于每个类别。

categoricalInformationValue(category1, category2, ..., tag)

结果指示离散(分类)要素如何使用 [category1, category2, ...] 有助于预测的价值的学习模型 tag.

simpleLinearRegression

执行简单(一维)线性回归。

simpleLinearRegression(x, y)

参数:

  • x — Column with dependent variable values.
  • y — Column with explanatory variable values.

返回值:

常量 (a, b) 结果行的 y = a*x + b.

SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3])
┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [0, 1, 2, 3])─┐
│ (1,0)                                                             │
└───────────────────────────────────────────────────────────────────┘
SELECT arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6])
┌─arrayReduce('simpleLinearRegression', [0, 1, 2, 3], [3, 4, 5, 6])─┐
│ (1,3)                                                             │
└───────────────────────────────────────────────────────────────────┘

随机指标线上回归

该函数实现随机线性回归。 它支持自定义参数的学习率L2正则化系数迷你批量大小并具有更新权重的方法很少 (亚当 (默认使用), 简单SGD, 动量, 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. 适合
See the `Fitting` section in the [stochasticLinearRegression](#stochasticlinearregression-usage-fitting) description.

Predicted labels have to be in \[-1, 1\].
  1. 预测
Using saved state we can predict probability of object having label `1`.

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

The query will return a column of probabilities. Note that first argument of `evalMLMethod` is `AggregateFunctionState` object, next are columns of features.

We can also set a bound of probability, which assigns elements to different labels.

``` 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)
```

Then the result will be labels.

`test_data` is a table like `train_data` but may not contain target value.

另请参阅

groupBitmapAnd

计算位图列的AND返回UInt64类型的基数如果添加后缀状态则返回 位图对象.

groupBitmapAnd(expr)

参数

expr An expression that results in AggregateFunction(groupBitmap, UInt*) 类型。

返回值

的价值 UInt64 类型。

示例

DROP TABLE IF EXISTS bitmap_column_expr_test2;
CREATE TABLE bitmap_column_expr_test2
(
    tag_id String,
    z AggregateFunction(groupBitmap, UInt32)
)
ENGINE = MergeTree
ORDER BY tag_id;

INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32))));
INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32))));
INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32))));

SELECT groupBitmapAnd(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%');
┌─groupBitmapAnd(z)─┐
               3   
└───────────────────┘

SELECT arraySort(bitmapToArray(groupBitmapAndState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%');
┌─arraySort(bitmapToArray(groupBitmapAndState(z)))─┐
 [6,8,10]                                         
└──────────────────────────────────────────────────┘

groupBitmapOr

计算位图列的OR返回UInt64类型的基数如果添加后缀状态则返回 位图对象. 这相当于 groupBitmapMerge.

groupBitmapOr(expr)

参数

expr An expression that results in AggregateFunction(groupBitmap, UInt*) 类型。

返回值

的价值 UInt64 类型。

示例

DROP TABLE IF EXISTS bitmap_column_expr_test2;
CREATE TABLE bitmap_column_expr_test2
(
    tag_id String,
    z AggregateFunction(groupBitmap, UInt32)
)
ENGINE = MergeTree
ORDER BY tag_id;

INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32))));
INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32))));
INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32))));

SELECT groupBitmapOr(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%');
┌─groupBitmapOr(z)─┐
             15   
└──────────────────┘

SELECT arraySort(bitmapToArray(groupBitmapOrState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%');
┌─arraySort(bitmapToArray(groupBitmapOrState(z)))─┐
 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]           
└─────────────────────────────────────────────────┘

groupBitmapXor

计算位图列的XOR返回UInt64类型的基数如果添加后缀状态则返回 位图对象.

groupBitmapOr(expr)

参数

expr An expression that results in AggregateFunction(groupBitmap, UInt*) 类型。

返回值

的价值 UInt64 类型。

示例

DROP TABLE IF EXISTS bitmap_column_expr_test2;
CREATE TABLE bitmap_column_expr_test2
(
    tag_id String,
    z AggregateFunction(groupBitmap, UInt32)
)
ENGINE = MergeTree
ORDER BY tag_id;

INSERT INTO bitmap_column_expr_test2 VALUES ('tag1', bitmapBuild(cast([1,2,3,4,5,6,7,8,9,10] as Array(UInt32))));
INSERT INTO bitmap_column_expr_test2 VALUES ('tag2', bitmapBuild(cast([6,7,8,9,10,11,12,13,14,15] as Array(UInt32))));
INSERT INTO bitmap_column_expr_test2 VALUES ('tag3', bitmapBuild(cast([2,4,6,8,10,12] as Array(UInt32))));

SELECT groupBitmapXor(z) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%');
┌─groupBitmapXor(z)─┐
              10   
└───────────────────┘

SELECT arraySort(bitmapToArray(groupBitmapXorState(z))) FROM bitmap_column_expr_test2 WHERE like(tag_id, 'tag%');
┌─arraySort(bitmapToArray(groupBitmapXorState(z)))─┐
 [1,3,5,6,8,10,11,13,14,15]                       
└──────────────────────────────────────────────────┘

原始文章