ClickHouse/docs/ja/sql-reference/functions/bitmap-functions.md
2024-11-18 11:58:58 +09:00

588 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
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 │
└─────┘
```