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

位图函数

位图可以通过两种方式构造。第一种方式是通过聚合函数 groupBitmap 与 -State 构造,另一种方式是从数组对象构造位图。

bitmapAnd

引入于:v20.1

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

语法

bitmapAnd(bitmap1, bitmap2)

参数

返回值

返回包含两个输入位图中均存在的位的位图 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)

参数

返回值

返回两个位图交集中的设置位的数量 UInt64

示例

用法示例

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

bitmapAndnot

引入于:v20.1

计算两个位图的逻辑与并取反结果(AND-NOT)。

语法

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

返回两个位图的 AND-NOT 操作的基数。

语法

bitmapAndnotCardinality(bitmap1, bitmap2)

参数

返回值

返回 bitmap1 AND-NOT bitmap2 结果中的设置位的数量 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)

参数

返回值

返回位图中设置的位的数量 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

检查第一个位图是否包含第二个位图的任何设置位。

语法

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

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

语法

bitmapMin(bitmap)

参数

返回值

返回位图中设置的最小位的位置,或 UINT32_MAX/UINT64_MAX UInt64

示例

用法示例

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

bitmapOr

引入于:v20.1

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

语法

bitmapOr(bitmap1, bitmap2)

参数

返回值

返回一个包含任一输入位图中设置位的位图 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)

参数

返回值

返回最多包含 cardinality_limit 个设置位的位图,从 range_start 开始 AggregateFunction(groupBitmap, T)

示例

用法示例

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

bitmapToArray

引入于:v20.1

将位图转换为无符号整数数组。它是函数 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)

参数

返回值

根据给定的映射,返回转换后的位图 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

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

语法

bitmapXor(bitmap1, bitmap2)

参数

返回值

返回一个包含任一输入位图中设置位的位图,但不包含两个位图中均存在的位 AggregateFunction(groupBitmap, T)

示例

用法示例

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

bitmapXorCardinality

引入于:v20.1

返回两个位图的 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)

参数

返回值

返回包含最多 limit 个设置位的位图,从 offset 设置位开始,按升序排列 AggregateFunction(groupBitmap, T)

示例

用法示例

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