跳转到主内容
跳转到主内容

uniqCombined

uniqCombined

引入版本:v1.1

计算不同参数值的大致数量。 它以确定性的方式提供结果(不依赖于查询处理顺序)。

注意

由于对非 String 类型使用 32 位哈希,对于明显大于 UINT_MAX 的基数,结果会有非常大的误差(在几十亿个不同值之后误差会迅速增大)。 如果基数大于 UINT_MAX,应改用 uniqCombined64

与 uniq 函数相比,uniqCombined 函数:

  • 内存消耗减少数倍
  • 计算精度提高数倍
  • 通常性能略低。在某些场景下,uniqCombined 的表现可能优于 uniq,例如在通过网络传输大量聚合状态的分布式查询中
Details

实现细节 此函数为聚合中的所有参数计算哈希(String 使用 64 位哈希,否则为 32 位哈希),然后在计算中使用该哈希值。 它结合使用了三种算法:数组、哈希表和带误差校正表的 HyperLogLog:

  • 对于少量不同元素,使用数组
  • 当集合大小更大时,使用哈希表
  • 对于更多元素时,使用 HyperLogLog,它会占用固定大小的内存

语法

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

参数

  • HLL_precision — 可选。HyperLogLog 中单元格数量的以 2 为底的对数。默认值为 17,对应约 96 KiB 的空间(2^17 个单元格,每个单元格 6 位)。取值范围:[12, 20]。UInt8

参数说明

返回值

返回一个 UInt64 类型的数值,表示不同参数值的近似个数。UInt64

示例

基本用法

SELECT uniqCombined(number) FROM numbers(1e6);
┌─uniqCombined(number)─┐
│              1001148 │
└──────────────────────┘

使用自定义精度

SELECT uniqCombined(15)(number) FROM numbers(1e5);
┌─uniqCombined(15)(number)─┐
│                   100768 │
└──────────────────────────┘

另请参阅