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

位图函数

位图可以通过两种方式构造。第一种方式是使用带有 -State 的聚合函数 groupBitmap 来构造,另一种方式是从 Array 对象构造位图。

bitmapAnd

引入版本:v20.1.0

计算两个位图的逻辑与(AND)运算。

语法

bitmapAnd(bitmap1, bitmap2)

参数

返回值

返回一个 bitmap,其中包含同时出现在两个输入 bitmap AggregateFunction(groupBitmap, T) 中的位。

示例

用法示例

SELECT bitmapToArray(bitmapAnd(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5]))) AS res;
┌─res─┐
│ [3] │
└─────┘

bitmapAndCardinality

自 v20.1.0 起引入

返回两个 bitmap 进行逻辑与(AND)运算结果的基数。

语法

bitmapAndCardinality(bitmap1, bitmap2)

参数

返回值

返回两个 bitmap 交集中被设置为 1 的位数。UInt64

示例

用法示例

SELECT bitmapAndCardinality(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   1 │
└─────┘

bitmapAndnot

引入版本:v20.1.0

计算两个 bitmap 之间的集合差 A AND-NOT B。

语法

bitmapAndnot(bitmap1, bitmap2)

参数

返回值

返回一个 bitmap(AggregateFunction(groupBitmap, T)),其中包含在第一个 bitmap 中存在但在第二个 bitmap 中不存在的已置位位(bit)。

示例

用法示例

SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5]))) AS res;
┌─res────┐
│ [1, 2] │
└────────┘

bitmapAndnotCardinality

引入版本:v20.1.0

返回两个 bitmap 之间 AND-NOT 运算结果的基数。

语法

bitmapAndnotCardinality(bitmap1, bitmap2)

参数

返回值

返回 bitmap1 AND-NOT bitmap2 结果中被设置为 1 的位数。UInt64

示例

使用示例

SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   2 │
└─────┘

bitmapBuild

引入版本:v20.1.0

根据无符号整数数组构建一个 bitmap。它是函数 bitmapToArray 的逆操作。

语法

bitmapBuild(array)

参数

返回值

返回由给定数组构建的 bitmap AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res, toTypeName(res);
┌─res─┬─toTypeName(bitmapBuild([1, 2, 3, 4, 5]))─────┐
│     │ AggregateFunction(groupBitmap, UInt8)        │
└─────┴──────────────────────────────────────────────┘

bitmapCardinality

引入于:v20.1.0

返回位图中被设置为 1 的位数(基数,cardinality)。

语法

bitmapCardinality(bitmap)

参数

返回值

返回 bitmap 中被置位的 bit 数量,类型为 UInt64

示例

用法示例

SELECT bitmapCardinality(bitmapBuild([1, 3, 3, 5, 7, 7])) AS res
┌─res─┐
│   4 │
└─────┘

bitmapContains

首次引入:v20.1.0

检查 bitmap 中是否包含指定元素。

语法

bitmapContains(bitmap, value)

参数

返回值

若 bitmap 包含指定值,则返回 1,否则返回 0,类型为 UInt8

示例

用法示例

SELECT bitmapContains(bitmapBuild([1, 2, 3]), 2) AS res;
┌─res─┐
│  1  │
└─────┘

bitmapHasAll

引入自:v20.1.0

检查第一个 bitmap 是否包含第二个 bitmap 中所有已设置的位。

语法

bitmapHasAll(bitmap1, bitmap2)

参数

返回值

如果第二个 bitmap 中所有被设置为 1 的位都存在于第一个 bitmap 中,则返回 1,否则返回 0,类型为 UInt8

示例

使用示例

SELECT bitmapHasAll(bitmapBuild([1, 2, 3]), bitmapBuild([2, 3])) AS res;
┌─res─┐
│  1  │
└─────┘

bitmapHasAny

自 v20.1.0 起引入

检查第一个 bitmap 是否包含第二个 bitmap 中的任意已置位的比特位。

语法

bitmapHasAny(bitmap1, bitmap2)

参数

返回值

如果第二个 bitmap 中的任意位在第一个 bitmap 中存在,则返回 1,否则返回 0,类型为 UInt8

示例

使用示例

SELECT bitmapHasAny(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5])) AS res;
┌─res─┐
│  1  │
└─────┘

bitmapMax

自 v20.1.0 起引入

返回位图中已设置的最高位的位置,如果位图为空则返回 0

语法

bitmapMax(bitmap)

参数

返回值

返回 bitmap 中最高置位比特的位置,否则返回 0 UInt64

示例

用法示例

SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res;
┌─res─┐
│   5 │
└─────┘

bitmapMin

首次引入版本:v20.1.0

返回 bitmap 中最小已置位 bit 的位置。若所有 bit 均未置位,则返回 UINT32_MAX(如果 bitmap 包含超过 2^64 个 bit,则返回 UINT64_MAX)。

语法

bitmapMin(bitmap)

参数

返回值

返回 bitmap 中被设置为 1 的最小位的位置,如果不存在则返回 UINT32_MAX/UINT64_MAX UInt64

示例

使用示例

SELECT bitmapMin(bitmapBuild([3, 5, 2, 6])) AS res;
┌─res─┐
│   2 │
└─────┘

bitmapOr

引入版本:v20.1.0

计算两个位图的逻辑或(OR)运算。

语法

bitmapOr(bitmap1, bitmap2)

参数

返回值

返回一个位图对象,其中包含在任一输入位图中已置位的 bit AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapToArray(bitmapOr(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5]))) AS res;
┌─res─────────────┐
│ [1, 2, 3, 4, 5] │
└─────────────────┘

bitmapOrCardinality

引入于:v20.1.0

返回两个 bitmap 进行逻辑或(OR)运算后结果的基数。

语法

bitmapOrCardinality(bitmap1, bitmap2)

参数

返回值

返回两个 bitmap 并集中的置位位数 UInt64

示例

使用示例

SELECT bitmapOrCardinality(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   5 │
└─────┘

bitmapSubsetInRange

自 v20.1.0 引入

返回位图的一个子集,仅包含指定区间 [start, end) 内被置位的位。使用从 1 开始计数的索引。

语法

bitmapSubsetInRange(bitmap, start, end)

参数

返回值

返回一个 bitmap,仅包含指定范围内已置位的比特位。AggregateFunction(groupBitmap, T)

示例

用法示例

SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([1, 2, 3, 4, 5]), 2, 5)) AS res;
┌─res───────┐
│ [2, 3, 4] │
└───────────┘

bitmapSubsetLimit

自 v20.1.0 起提供

从位置 range_start 开始返回一个 bitmap 的子集,最多包含 cardinality_limit 个被置位的位。采用从 1 开始计数的索引方式。

语法

bitmapSubsetLimit(bitmap, range_start, cardinality_limit)

参数

返回值

返回一个 bitmap,其中包含从 range_start 开始、至多 cardinality_limit 个已置位的位。AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapToArray(bitmapSubsetLimit(bitmapBuild([1, 5, 3, 2, 8]), 3, 2)) AS res;
┌─res────┐
│ [5, 3] │
└────────┘

bitmapToArray

自 v20.1.0 起引入

将 bitmap 转换为由无符号整数组成的数组。它与函数 bitmapBuild 的功能相反。

语法

bitmapToArray(bitmap)

参数

返回值

返回位图中包含的无符号整数的数组 Array(UInt*)

示例

用法示例

SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res;
┌─res─────────────┐
│ [1, 2, 3, 4, 5] │
└─────────────────┘

bitmapTransform

自 v20.1.0 起引入

通过将位图中 from_array 指定的位值替换为 to_array 中对应的位值,最多可更改 N 个比特位。

语法

bitmapTransform(bitmap, from_array, to_array)

参数

返回值

返回一个根据给定映射完成元素转换的位图对象 AggregateFunction(groupBitmap, T)

示例

使用示例

SELECT bitmapToArray(bitmapTransform(bitmapBuild([1, 2, 3, 4, 5]), [2, 4], [20, 40])) AS res;
┌─res───────────────┐
│ [1, 3, 5, 20, 40] │
└───────────────────┘

bitmapXor

自 v20.1.0 起引入

计算两个位图的对称差(XOR)。

语法

bitmapXor(bitmap1, bitmap2)

参数

返回值

返回一个 bitmap,其中包含仅存在于任一输入 bitmap 中、但不同时存在于两个 bitmap 中的已置位位,比特类型为 AggregateFunction(groupBitmap, T)

示例

用法示例

SELECT bitmapToArray(bitmapXor(bitmapBuild([1, 2, 3]), bitmapBuild([3, 4, 5]))) AS res;
┌─res──────────┐
│ [1, 2, 4, 5] │
└──────────────┘

bitmapXorCardinality

引入版本:v20.1.0

返回两个 bitmap 的 XOR(对称差)的基数。

语法

bitmapXorCardinality(bitmap1, bitmap2)

参数

返回值

返回两个 bitmap 的对称差中位为 1 的数量 UInt64

示例

用法示例

SELECT bitmapXorCardinality(bitmapBuild([1,2,3]), bitmapBuild([3,4,5])) AS res;
┌─res─┐
│   4 │
└─────┘

subBitmap

自 v21.9.0 起引入

返回一个从位置 offset 开始的 bitmap 子集。返回的 bitmap 的最大基数为 cardinality_limit

语法

subBitmap(bitmap, offset, cardinality_limit)

参数

返回值

返回一个 bitmap,该 bitmap 自跳过 offset 个置位位之后起按升序选择,至多包含 limit 个置位位。AggregateFunction(groupBitmap, T)

示例

用法示例

SELECT bitmapToArray(subBitmap(bitmapBuild([1, 2, 3, 4, 5]), 2, 2)) AS res;
┌─res────┐
│ [3, 4] │
└────────┘