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

位图函数

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

bitmapAnd

引入版本:v20.1

计算两个位图的逻辑与(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 引入

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

语法

bitmapAndCardinality(bitmap1, bitmap2)

参数

返回值

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

示例

使用示例

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

bitmapAndnot

引入于:v20.1

计算两个位图的集合差 A AND-NOT B。

语法

bitmapAndnot(bitmap1, bitmap2)

参数

返回值

返回一个位图对象,其中包含在第一个位图中出现但在第二个位图中不存在的已设置位。AggregateFunction(groupBitmap, T)

示例

使用示例

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

bitmapAndnotCardinality

引入版本:v20.1

返回对两个 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 引入

根据无符号整数数组构建位图。它与函数 bitmapToArray 的作用相反。

语法

bitmapBuild(array)

参数

返回值

从提供的数组生成并返回一个位图。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 起引入

返回位图中已设置位的数量(基数)。

语法

bitmapCardinality(bitmap)

参数

返回值

返回 bitmap 中已置位的位数,类型为 UInt64

示例

使用示例

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

bitmapContains

自 v20.1 版本引入

检查位图中是否包含特定元素。

语法

bitmapContains(bitmap, value)

参数

返回值

如果位图包含指定的值,则返回 1,否则返回 0,返回类型为 UInt8

示例

使用示例

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

bitmapHasAll

自 v20.1 起引入

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

语法

bitmapHasAll(bitmap1, bitmap2)

参数

返回值

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

示例

使用示例

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

bitmapHasAny

引入版本:v20.1

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

语法

bitmapHasAny(bitmap1, bitmap2)

参数

返回值

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

示例

用法示例

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

bitmapMax

引入版本:v20.1

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

语法

bitmapMax(bitmap)

参数

返回值

返回位图中最高被置位的位的位置,否则返回 0,类型为 UInt64

示例

用法示例

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

bitmapMin

引入于:v20.1

返回位图中第一个被设置为 1 的位的位置。如果所有位都未设置,则返回 UINT32_MAX(如果位图包含超过 2^64 位,则返回 UINT64_MAX)。

语法

bitmapMin(bitmap)

参数

返回值

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

示例

使用示例

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

bitmapOr

引入版本:v20.1

计算两个 bitmap 的逻辑或(OR)。

语法

bitmapOr(bitmap1, bitmap2)

参数

返回值

返回一个 bitmap,其中包含在任一输入 bitmap 中被置位的比特。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 引入

返回两个位图进行逻辑或(OR)运算后的基数。

语法

bitmapOrCardinality(bitmap1, bitmap2)

参数

返回值

返回两个位图并集中的已置位位数,类型为 UInt64

示例

用法示例

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

bitmapSubsetInRange

自 v20.1 起引入

返回位图在指定范围 [start, end) 内的一个子集,仅包含该范围内已置位的比特。索引从 1 开始计数。

语法

bitmapSubsetInRange(bitmap, start, end)

参数

返回值

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

示例

用法示例

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

bitmapSubsetLimit

自 v20.1 引入

返回位图中从位置 range_start 开始的一个子集,其中最多包含 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 起引入

将 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 引入

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

语法

bitmapTransform(bitmap, from_array, to_array)

参数

返回值

返回一个根据给定映射关系完成元素转换的 bitmap。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 版本引入

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

语法

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

返回两个 bitmap 的 XOR(对称差)运算结果的基数。

语法

bitmapXorCardinality(bitmap1, bitmap2)

参数

返回值

返回两个位图对称差中被置位的比特数,UInt64

示例

使用示例

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

subBitmap

自 v21.9 起引入

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

语法

subBitmap(bitmap, offset, cardinality_limit)

参数

  • bitmap — 位图对象。AggregateFunction(groupBitmap, T)。- offset — 从起始位置开始需要跳过的已置位位的数量(从零开始计数)。UInt32 - cardinality_limit — 要包含在子集中的已置位位的最大数量。UInt32

返回值

返回一个位图,在按升序跳过 offset 个已置位位之后,最多包含 limit 个已置位位。AggregateFunction(groupBitmap, T)

示例

使用示例

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