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

23 KiB
Raw Blame History

slug sidebar_position sidebar_label
/ja/sql-reference/functions/tuple-functions 180 タプル

tuple

複数のカラムをグループ化するための関数です。 タイプ T1, T2, ... を持つカラム C1, C2, ... に対して、それらの名前がユニークでアンコーテッド識別子として扱える場合、Tuple(C1 T1, C2 T2, ...) 型の名前付きタプルを返し、そうでない場合は Tuple(T1, T2, ...) を返します。この関数を実行する際のコストはありません。 通常、タプルはIN演算子の引数としての中間値、またはラムダ関数の形式パラメータリストを作成するために使用されます。タプルはテーブルに書き込むことはできません。

この関数は演算子 (x, y, ...) を実装しています。

構文

tuple(x, y, ...)

tupleElement

タプルからカラムを取得するための関数です。

第2引数が数値 index の場合、それは1から始まるカラムインデックスです。第2引数が文字列 name の場合、それは要素の名前を表します。また、第2引数が範囲外の場合や名前に対応する要素が存在しない場合にデフォルト値を返す第3のオプション引数を指定することができます。提供された場合、第2および第3の引数は定数でなければなりません。この関数を実行するコストはありません。

この関数はオペレータ x.index および x.name を実装しています。

構文

tupleElement(tuple, index, [, default_value])
tupleElement(tuple, name, [, default_value])

untuple

tuple要素を呼び出し位置での文法置換を行います。

結果のカラムの名前は実装固有であり、変更される可能性があります。untupleの後に特定のカラム名を仮定しないでください。

構文

untuple(x)

EXCEPT 式を使用して、クエリの結果としてカラムをスキップすることができます。

引数

  • xtuple 関数、カラム、または要素のタプル。Tuple

返される値

  • なし。

入力テーブル:

┌─key─┬─v1─┬─v2─┬─v3─┬─v4─┬─v5─┬─v6────────┐
│   1 │ 10 │ 20 │ 40 │ 30 │ 15 │ (33,'ab') │
│   2 │ 25 │ 65 │ 70 │ 40 │  6 │ (44,'cd') │
│   3 │ 57 │ 30 │ 20 │ 10 │  5 │ (55,'ef') │
│   4 │ 55 │ 12 │  7 │ 80 │ 90 │ (66,'gh') │
│   5 │ 30 │ 50 │ 70 │ 25 │ 55 │ (77,'kl') │
└─────┴────┴────┴────┴────┴────┴───────────┘

Tuple 型カラムを untuple 関数のパラメータとして使用する例:

クエリ:

SELECT untuple(v6) FROM kv;

結果:

┌─_ut_1─┬─_ut_2─┐
│    33 │ ab    │
│    44 │ cd    │
│    55 │ ef    │
│    66 │ gh    │
│    77 │ kl    │
└───────┴───────┘

EXCEPT 式の使用例:

クエリ:

SELECT untuple((* EXCEPT (v2, v3),)) FROM kv;

結果:

┌─key─┬─v1─┬─v4─┬─v5─┬─v6────────┐
│   1 │ 10 │ 30 │ 15 │ (33,'ab') │
│   2 │ 25 │ 40 │  6 │ (44,'cd') │
│   3 │ 57 │ 10 │  5 │ (55,'ef') │
│   4 │ 55 │ 80 │ 90 │ (66,'gh') │
│   5 │ 30 │ 25 │ 55 │ (77,'kl') │
└─────┴────┴────┴────┴───────────┘

参照

tupleHammingDistance

2つの同サイズのタプル間のハミング距離を返します。

構文

tupleHammingDistance(tuple1, tuple2)

引数

  • tuple1 — 最初のタプル。Tuple
  • tuple2 — 2つ目のタプル。Tuple

タプルは同様の型の要素を持たなければなりません。

返される値

  • ハミング距離。

:::note 結果タイプは算術関数の場合と同様に、入力タプルの要素数に基づいて計算されます。 :::

SELECT
    toTypeName(tupleHammingDistance(tuple(0), tuple(0))) AS t1,
    toTypeName(tupleHammingDistance((0, 0), (0, 0))) AS t2,
    toTypeName(tupleHammingDistance((0, 0, 0), (0, 0, 0))) AS t3,
    toTypeName(tupleHammingDistance((0, 0, 0, 0), (0, 0, 0, 0))) AS t4,
    toTypeName(tupleHammingDistance((0, 0, 0, 0, 0), (0, 0, 0, 0, 0))) AS t5
┌─t1────┬─t2─────┬─t3─────┬─t4─────┬─t5─────┐
│ UInt8 │ UInt16 │ UInt32 │ UInt64 │ UInt64 │
└───────┴────────┴────────┴────────┴────────┘

クエリ:

SELECT tupleHammingDistance((1, 2, 3), (3, 2, 1)) AS HammingDistance;

結果:

┌─HammingDistance─┐
│               2 │
└─────────────────┘

MinHash 関数と共に半重複文字列の検出に使用できます:

SELECT tupleHammingDistance(wordShingleMinHash(string), wordShingleMinHashCaseInsensitive(string)) AS HammingDistance
FROM (SELECT 'ClickHouse is a column-oriented database management system for online analytical processing of queries.' AS string);

結果:

┌─HammingDistance─┐
│               2 │
└─────────────────┘

tupleToNameValuePairs

名前付きタプルを(名前, 値)ペアの配列に変換します。Tuple(a T, b T, ..., c T) に対しては、Array(Tuple(String, T), ...) を返します。ここで Strings はタプルの名前付きフィールドを表し、T はそれらの名前に関連付けられた値です。タプル内のすべての値は同じタイプでなければなりません。

構文

tupleToNameValuePairs(tuple)

引数

  • tuple — 名前付きタプル。Tuple 型で、任意のタイプの値を持つ。

返される値

クエリ:

CREATE TABLE tupletest (col Tuple(user_ID UInt64, session_ID UInt64)) ENGINE = Memory;

INSERT INTO tupletest VALUES (tuple( 100, 2502)), (tuple(1,100));

SELECT tupleToNameValuePairs(col) FROM tupletest;

結果:

┌─tupleToNameValuePairs(col)────────────┐
│ [('user_ID',100),('session_ID',2502)] │
│ [('user_ID',1),('session_ID',100)]    │
└───────────────────────────────────────┘

この関数を使用してカラムを行に変換することが可能です:

CREATE TABLE tupletest (col Tuple(CPU Float64, Memory Float64, Disk Float64)) ENGINE = Memory;

INSERT INTO tupletest VALUES(tuple(3.3, 5.5, 6.6));

SELECT arrayJoin(tupleToNameValuePairs(col)) FROM tupletest;

結果:

┌─arrayJoin(tupleToNameValuePairs(col))─┐
│ ('CPU',3.3)                           │
│ ('Memory',5.5)                        │
│ ('Disk',6.6)                          │
└───────────────────────────────────────┘

単純なタプルを関数に渡すと、ClickHouseは値のインデックスをその名前として使用します:

SELECT tupleToNameValuePairs(tuple(3, 2, 1));

結果:

┌─tupleToNameValuePairs(tuple(3, 2, 1))─┐
│ [('1',3),('2',2),('3',1)]             │
└───────────────────────────────────────┘

tupleNames

タプルをカラム名の配列に変換します。Tuple(a T, b T, ...) 形式のタプルに対しては、タプルの名前付きカラムを表す文字列の配列を返します。タプルの要素に明示的な名前がない場合、そのインデックスがカラム名として使用されます。

構文

tupleNames(tuple)

引数

  • tuple — 名前付きタプル。Tuple 型で、任意のタイプの値を持つ。

返される値

  • 文字列の配列。

型: Array(Tuple(String, ...))。

クエリ:

CREATE TABLE tupletest (col Tuple(user_ID UInt64, session_ID UInt64)) ENGINE = Memory;

INSERT INTO tupletest VALUES (tuple(1, 2));

SELECT tupleNames(col) FROM tupletest;

結果:

┌─tupleNames(col)──────────┐
│ ['user_ID','session_ID'] │
└──────────────────────────┘

単純なタプルを関数に渡すと、ClickHouseはカラムのインデックスをその名前として使用します:

SELECT tupleNames(tuple(3, 2, 1));

結果:

┌─tupleNames((3, 2, 1))─┐
│ ['1','2','3']         │
└───────────────────────┘

tuplePlus

同サイズの2つのタプルの対応する値を足した値を計算します。

構文

tuplePlus(tuple1, tuple2)

別名: vectorSum.

引数

  • tuple1 — 最初のタプル。Tuple
  • tuple2 — 2つ目のタプル。Tuple

返される値

  • 合計のタプル。Tuple

クエリ:

SELECT tuplePlus((1, 2), (2, 3));

結果:

┌─tuplePlus((1, 2), (2, 3))─┐
│ (3,5)                     │
└───────────────────────────┘

tupleMinus

同サイズの2つのタプルの対応する値から引き算した値を計算します。

構文

tupleMinus(tuple1, tuple2)

別名: vectorDifference.

引数

  • tuple1 — 最初のタプル。Tuple
  • tuple2 — 2つ目のタプル。Tuple

返される値

  • 引き算の結果のタプル。Tuple

クエリ:

SELECT tupleMinus((1, 2), (2, 3));

結果:

┌─tupleMinus((1, 2), (2, 3))─┐
│ (-1,-1)                    │
└────────────────────────────┘

tupleMultiply

同サイズの2つのタプルの対応する値の掛け算を計算します。

構文

tupleMultiply(tuple1, tuple2)

引数

  • tuple1 — 最初のタプル。Tuple
  • tuple2 — 2つ目のタプル。Tuple

返される値

  • 掛け算の結果のタプル。Tuple

クエリ:

SELECT tupleMultiply((1, 2), (2, 3));

結果:

┌─tupleMultiply((1, 2), (2, 3))─┐
│ (2,6)                         │
└───────────────────────────────┘

tupleDivide

同サイズの2つのタプルの対応する値の割り算を計算します。ゼロでの割り算はinfを返すことに注意してください。

構文

tupleDivide(tuple1, tuple2)

引数

  • tuple1 — 最初のタプル。Tuple
  • tuple2 — 2つ目のタプル。Tuple

返される値

  • 割り算の結果のタプル。Tuple

クエリ:

SELECT tupleDivide((1, 2), (2, 3));

結果:

┌─tupleDivide((1, 2), (2, 3))─┐
│ (0.5,0.6666666666666666)    │
└─────────────────────────────┘

tupleNegate

タプルの値の否定を計算します。

構文

tupleNegate(tuple)

引数

返される値

  • 否定の結果のタプル。Tuple

クエリ:

SELECT tupleNegate((1, 2));

結果:

┌─tupleNegate((1, 2))─┐
│ (-1,-2)             │
└─────────────────────┘

tupleMultiplyByNumber

全ての値を数値で掛けた結果のタプルを返します。

構文

tupleMultiplyByNumber(tuple, number)

引数

返される値

  • 掛け算の結果のタプル。Tuple

クエリ:

SELECT tupleMultiplyByNumber((1, 2), -2.1);

結果:

┌─tupleMultiplyByNumber((1, 2), -2.1)─┐
│ (-2.1,-4.2)                         │
└─────────────────────────────────────┘

tupleDivideByNumber

全ての値を数値で割った結果のタプルを返します。ゼロでの割り算はinfを返すことに注意してください。

構文

tupleDivideByNumber(tuple, number)

引数

返される値

  • 割り算の結果のタプル。Tuple

クエリ:

SELECT tupleDivideByNumber((1, 2), 0.5);

結果:

┌─tupleDivideByNumber((1, 2), 0.5)─┐
│ (2,4)                            │
└──────────────────────────────────┘

tupleConcat

渡されたタプルを結合します。

tupleConcat(tuples)

引数

  • tuples 任意の数のTuple 型の引数。

SELECT tupleConcat((1, 2), (3, 4), (true, false)) AS res
┌─res──────────────────┐
│ (1,2,3,4,true,false) │
└──────────────────────┘

tupleIntDiv

タプルの分子とタプルの除数の整数部の割り算を行い、商のタプルを返します。

構文

tupleIntDiv(tuple_num, tuple_div)

パラメータ

  • tuple_num: 分子の値のタプル。Tuple of numeric type。
  • tuple_div: 除数の値のタプル。Tuple of numeric type。

返される値

  • tuple_numtuple_div の商のタプル。Tuple of integer values。

実装の詳細

  • tuple_num または tuple_div のいずれかが非整数値を含む場合、結果は各非整数の分子または除数を最も近い整数に丸めて計算されます。
  • ゼロ除算にはエラーがスローされます。

クエリ:

SELECT tupleIntDiv((15, 10, 5), (5, 5, 5));

結果:

┌─tupleIntDiv((15, 10, 5), (5, 5, 5))─┐
│ (3,2,1)                             │
└─────────────────────────────────────┘

クエリ:

SELECT tupleIntDiv((15, 10, 5), (5.5, 5.5, 5.5));

結果:

┌─tupleIntDiv((15, 10, 5), (5.5, 5.5, 5.5))─┐
│ (2,1,0)                                   │
└───────────────────────────────────────────┘

tupleIntDivOrZero

tupleIntDivと同様に、タプルの分子とタプルの除数の整数部の割り算を行い、商のタプルを返します。0の除数に対してエラーをスローするのではなく、商として0を返します。

構文

tupleIntDivOrZero(tuple_num, tuple_div)
  • tuple_num: 分子の値のタプル。 Tuple of numeric type。
  • tuple_div: 除数の値のタプル。 Tuple of numeric type。

返される値

  • tuple_numtuple_div の商のタプル。 Tuple of integer values。
  • 除数が0の場合、商として0を返します。

実装の詳細

  • tuple_numまたはtuple_divのいずれかが非整数値を含む場合、tupleIntDivのように、各非整数の分子または除数を最も近い整数に丸めて結果を計算します。

クエリ:

SELECT tupleIntDivOrZero((5, 10, 15), (0, 0, 0));

結果:

┌─tupleIntDivOrZero((5, 10, 15), (0, 0, 0))─┐
│ (0,0,0)                                   │
└───────────────────────────────────────────┘

tupleIntDivByNumber

分子タプルを指定された除数で整数除算し、商のタプルを返します。

構文

tupleIntDivByNumber(tuple_num, div)

パラメータ

  • tuple_num: 分子の値のタプル。 Tuple of numeric type。
  • div: 除数の値。 Numeric type。

返される値

  • tuple_numdivの商のタプル。 Tuple of integer values。

実装の詳細

  • tuple_numまたはdivのいずれかが非整数値を含む場合、結果は各非整数の分子または除数を最も近い整数に丸めて計算されます。
  • 0での除算にはエラーがスローされます。

クエリ:

SELECT tupleIntDivByNumber((15, 10, 5), 5);

結果:

┌─tupleIntDivByNumber((15, 10, 5), 5)─┐
│ (3,2,1)                             │
└─────────────────────────────────────┘

クエリ:

SELECT tupleIntDivByNumber((15.2, 10.7, 5.5), 5.8);

結果:

┌─tupleIntDivByNumber((15.2, 10.7, 5.5), 5.8)─┐
│ (2,1,0)                                     │
└─────────────────────────────────────────────┘

tupleIntDivOrZeroByNumber

tupleIntDivByNumberと同様に、分子タプルを指定された除数で整数除算し、商のタプルを返します。0の除数に対してエラーをスローするのではなく、商として0を返します。

構文

tupleIntDivOrZeroByNumber(tuple_num, div)

パラメータ

  • tuple_num: 分子の値のタプル。 Tuple of numeric type。
  • div: 除数の値。 Numeric type。

返される値

  • tuple_numdivの商のタプル。 Tuple of integer values。
  • 除数が0の場合、商として0を返します。

実装の詳細

  • tuple_numまたはdivのいずれかが非整数値を含む場合、tupleIntDivByNumberのように、各非整数の分子または除数を最も近い整数に丸めて結果を計算します。

クエリ:

SELECT tupleIntDivOrZeroByNumber((15, 10, 5), 5);

結果:

┌─tupleIntDivOrZeroByNumber((15, 10, 5), 5)─┐
│ (3,2,1)                                   │
└───────────────────────────────────────────┘

クエリ:

SELECT tupleIntDivOrZeroByNumber((15, 10, 5), 0)

結果:

┌─tupleIntDivOrZeroByNumber((15, 10, 5), 0)─┐
│ (0,0,0)                                   │
└───────────────────────────────────────────┘

tupleModulo

2つのタプルの除算操作の剰余余りのタプルを返します。

構文

tupleModulo(tuple_num, tuple_mod)

パラメータ

  • tuple_num: 分子の値のタプル。Tuple of numeric type。
  • tuple_div: 剰余の値のタプル。Tuple of numeric type。

返される値

  • tuple_numtuple_divの余りのタプル。Tuple of non-zero integer values。
  • ゼロでの除算にはエラーがスローされます。

クエリ:

SELECT tupleModulo((15, 10, 5), (5, 3, 2));

結果:

┌─tupleModulo((15, 10, 5), (5, 3, 2))─┐
│ (0,1,1)                             │
└─────────────────────────────────────┘

tupleModuloByNumber

指定された除数でタプルの除算操作の剰余(余り)のタプルを返します。

構文

tupleModuloByNumber(tuple_num, div)

パラメータ

  • tuple_num: 分子の値のタプル。Tuple of numeric type。
  • div: 除数の値。 Numeric type。

返される値

  • tuple_numdivの余りのタプル。Tuple of non-zero integer values。
  • ゼロでの除算にはエラーがスローされます。

クエリ:

SELECT tupleModuloByNumber((15, 10, 5), 2);

結果:

┌─tupleModuloByNumber((15, 10, 5), 2)─┐
│ (1,0,1)                             │
└─────────────────────────────────────┘

flattenTuple

ネストされた名前付き input タプルから平坦化された output タプルを返します。output タプルの要素は元の input タプルからのパスです。例: Tuple(a Int, Tuple(b Int, c Int)) -> Tuple(a Int, b Int, c Int)flattenTuple を使用して、Object タイプからのすべてのパスを別々のカラムとして選択することができます。

構文

flattenTuple(input)

パラメータ

  • input: 平坦化するネストされた名前付きタプル。Tuple

返される値

  • 元の input からのパスが要素となる output タプル。Tuple

クエリ:

CREATE TABLE t_flatten_tuple(t Tuple(t1 Nested(a UInt32, s String), b UInt32, t2 Tuple(k String, v UInt32))) ENGINE = Memory;
INSERT INTO t_flatten_tuple VALUES (([(1, 'a'), (2, 'b')], 3, ('c', 4)));
SELECT flattenTuple(t) FROM t_flatten_tuple;

結果:

┌─flattenTuple(t)───────────┐
│ ([1,2],['a','b'],3,'c',4) │
└───────────────────────────┘

距離関数

すべてのサポートされている関数は距離関数のドキュメントで説明されています。