ClickHouse/docs/ja/sql-reference/functions/bitmap-functions.md

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

588 lines
12 KiB
Markdown
Raw Normal View History

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