12 KiB
slug | sidebar_position | sidebar_label |
---|---|---|
/ja/sql-reference/functions/bitmap-functions | 25 | Bitmap |
Bitmap関数
ビットマップは2つの方法で構築できます。1つ目は集計関数groupBitmapと-State
を用いて構築する方法で、もう1つは配列オブジェクトからビットマップを構築する方法です。
bitmapBuild
符号なし整数配列からビットマップを構築します。
構文
bitmapBuild(array)
引数
array
– 符号なし整数配列。
例
SELECT bitmapBuild([1, 2, 3, 4, 5]) AS res, toTypeName(res);
┌─res─┬─toTypeName(bitmapBuild([1, 2, 3, 4, 5]))─────┐
│ │ AggregateFunction(groupBitmap, UInt8) │
└─────┴──────────────────────────────────────────────┘
bitmapToArray
ビットマップを整数配列に変換します。
構文
bitmapToArray(bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapToArray(bitmapBuild([1, 2, 3, 4, 5])) AS res;
結果:
┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘
bitmapSubsetInRange
値の範囲内のビットを持つビットマップのサブセットを返します。
構文
bitmapSubsetInRange(bitmap, range_start, range_end)
引数
bitmap
– ビットマップオブジェクト。range_start
– 範囲の開始点(含む)。UInt32。range_end
– 範囲の終了点(排他的)。UInt32。
例
SELECT bitmapToArray(bitmapSubsetInRange(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res;
結果:
┌─res───────────────┐
│ [30,31,32,33,100] │
└───────────────────┘
bitmapSubsetLimit
最小のビット値range_start
を持ち、最大cardinality_limit
個の要素を持つビットマップのサブセットを返します。
構文
bitmapSubsetLimit(bitmap, range_start, cardinality_limit)
引数
bitmap
– ビットマップオブジェクト。range_start
– 範囲の開始点(含む)。UInt32。cardinality_limit
– サブセットの最大カーディナリティ。UInt32。
例
SELECT bitmapToArray(bitmapSubsetLimit(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(30), toUInt32(200))) AS res;
結果:
┌─res───────────────────────┐
│ [30,31,32,33,100,200,500] │
└───────────────────────────┘
subBitmap
指定した位置offset
から始まるビットマップのサブセットを返します。返されるビットマップの最大カーディナリティはcardinality_limit
です。
構文
subBitmap(bitmap, offset, cardinality_limit)
引数
bitmap
– ビットマップ。ビットマップオブジェクト。offset
– サブセットの最初の要素の位置。UInt32。cardinality_limit
– サブセット内の要素の最大数。UInt32。
例
SELECT bitmapToArray(subBitmap(bitmapBuild([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500]), toUInt32(10), toUInt32(10))) AS res;
結果:
┌─res─────────────────────────────┐
│ [10,11,12,13,14,15,16,17,18,19] │
└─────────────────────────────────┘
bitmapContains
ビットマップに要素が含まれているか確認します。
bitmapContains(bitmap, needle)
引数
bitmap
– ビットマップオブジェクト。needle
– 検索するビット値。UInt32。
返される値
例
SELECT bitmapContains(bitmapBuild([1,5,7,9]), toUInt32(9)) AS res;
結果:
┌─res─┐
│ 1 │
└─────┘
bitmapHasAny
2つのビットマップが交差しているか確認します。
bitmap2
が正確に1つの要素を含む場合、bitmapContainsを使用することを検討してみてください。より効率的に動作します。
構文
bitmapHasAny(bitmap1, bitmap2)
引数
bitmap1
– ビットマップオブジェクト1。bitmap2
– ビットマップオブジェクト2。
返される値
1
-bitmap1
とbitmap2
が少なくとも1つの共有要素を持つ場合。0
- それ以外の場合。
例
SELECT bitmapHasAny(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
結果:
┌─res─┐
│ 1 │
└─────┘
bitmapHasAll
最初のビットマップが2番目のビットマップのすべての要素を含む場合は1を返し、そうでない場合は0を返します。 2番目のビットマップが空であれば、1を返します。
hasAll(array, array)
も参照してください。
構文
bitmapHasAll(bitmap1, bitmap2)
引数
bitmap1
– ビットマップオブジェクト1。bitmap2
– ビットマップオブジェクト2。
例
SELECT bitmapHasAll(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
結果:
┌─res─┐
│ 0 │
└─────┘
bitmapCardinality
ビットマップのカーディナリティを返します。
構文
bitmapCardinality(bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res;
結果:
┌─res─┐
│ 5 │
└─────┘
bitmapMin
ビットマップで設定されている最小のビットを算出し、ビットマップが空の場合はUINT32_MAXを返します。
構文
bitmapMin(bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res;
結果:
┌─res─┐
│ 1 │
└─────┘
bitmapMax
ビットマップで設定されている最大のビットを算出し、ビットマップが空の場合は0を返します。
構文
bitmapMax(bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res;
結果:
┌─res─┐
│ 5 │
└─────┘
bitmapTransform
ビットマップ内のビットを最大N個置き換えます。置き換えられるビットの古い値と新しい値は、それぞれfrom_array[i]
とto_array[i]
で指定されます。
from_array
とto_array
の配列の順序によって結果が異なります。
構文
bitmapTransform(bitmap, from_array, to_array)
引数
bitmap
– ビットマップオブジェクト。from_array
– UInt32配列。範囲[0, from_array.size())内のidxについて、ビットマップがfrom_array[idx]を含む場合、それをto_array[idx]で置き換えます。to_array
–from_array
と同じサイズのUInt32配列。
例
SELECT bitmapToArray(bitmapTransform(bitmapBuild([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]), cast([5,999,2] as Array(UInt32)), cast([2,888,20] as Array(UInt32)))) AS res;
結果:
┌─res───────────────────┐
│ [1,3,4,6,7,8,9,10,20] │
└───────────────────────┘
bitmapAnd
2つのビットマップの論理積を計算します。
構文
bitmapAnd(bitmap,bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapToArray(bitmapAnd(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
結果:
┌─res─┐
│ [3] │
└─────┘
bitmapOr
2つのビットマップの論理和を計算します。
構文
bitmapOr(bitmap,bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapToArray(bitmapOr(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
結果:
┌─res─────────┐
│ [1,2,3,4,5] │
└─────────────┘
bitmapXor
2つのビットマップの排他的論理和を計算します。
構文
bitmapXor(bitmap,bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapToArray(bitmapXor(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
結果:
┌─res───────┐
│ [1,2,4,5] │
└───────────┘
bitmapAndnot
2つのビットマップの論理積を計算して結果を否定します。
構文
bitmapAndnot(bitmap,bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapToArray(bitmapAndnot(bitmapBuild([1,2,3]),bitmapBuild([3,4,5]))) AS res;
結果:
┌─res───┐
│ [1,2] │
└───────┘
bitmapAndCardinality
2つのビットマップの論理積のカーディナリティを返します。
構文
bitmapAndCardinality(bitmap,bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapAndCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
結果:
┌─res─┐
│ 1 │
└─────┘
bitmapOrCardinality
2つのビットマップの論理和のカーディナリティを返します。
bitmapOrCardinality(bitmap,bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapOrCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
結果:
┌─res─┐
│ 5 │
└─────┘
bitmapXorCardinality
2つのビットマップの排他的論理和のカーディナリティを返します。
bitmapXorCardinality(bitmap,bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapXorCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
結果:
┌─res─┐
│ 4 │
└─────┘
bitmapAndnotCardinality
2つのビットマップのAND-NOT操作のカーディナリティを返します。
bitmapAndnotCardinality(bitmap,bitmap)
引数
bitmap
– ビットマップオブジェクト。
例
SELECT bitmapAndnotCardinality(bitmapBuild([1,2,3]),bitmapBuild([3,4,5])) AS res;
結果:
┌─res─┐
│ 2 │
└─────┘