Nested(name1 Type1, Name2 Type2, ...)
ネストされたデータ構造は、セル内のテーブルのようなものです。ネストされたデータ構造のパラメーター - カラム名とタイプ - は、CREATE TABLE クエリと同じ方法で指定されます。各テーブルの行は、ネストされたデータ構造内の任意の数の行に対応できます。
例:
CREATE TABLE test.visits
(
CounterID UInt32,
StartDate Date,
Sign Int8,
IsNew UInt8,
VisitID UInt64,
UserID UInt64,
...
Goals Nested
(
ID UInt32,
Serial UInt32,
EventTime DateTime,
Price Int64,
OrderID String,
CurrencyID UInt32
),
...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
この例では、Goals
ネストされたデータ構造が宣言されており、コンバージョン(達成した目標)に関するデータが含まれています。'visits' テーブルの各行は、ゼロまたは任意の数のコンバージョンに対応できます。
flatten_nested が 0
に設定されている場合(デフォルトではない)、任意のレベルのネストがサポートされます。
ほとんどの場合、ネストされたデータ構造を扱う際には、そのカラムはドットで区切られたカラム名で指定されます。これらのカラムは、対応するタイプの配列を構成します。単一のネストされたデータ構造のすべてのカラム配列は、同じ長さを持っています。
例:
SELECT
Goals.ID,
Goals.EventTime
FROM test.visits
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goals.ID───────────────────────┬─Goals.EventTime───────────────────────────────────────────────────────────────────────────┐
│ [1073752,591325,591325] │ ['2014-03-17 16:38:10','2014-03-17 16:38:48','2014-03-17 16:42:27'] │
│ [1073752] │ ['2014-03-17 00:28:25'] │
│ [1073752] │ ['2014-03-17 10:46:20'] │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:59:20','2014-03-17 22:17:55','2014-03-17 22:18:07','2014-03-17 22:18:51'] │
│ [] │ [] │
│ [1073752,591325,591325] │ ['2014-03-17 11:37:06','2014-03-17 14:07:47','2014-03-17 14:36:21'] │
│ [] │ [] │
│ [] │ [] │
│ [591325,1073752] │ ['2014-03-17 00:46:05','2014-03-17 00:46:05'] │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:28:33','2014-03-17 13:30:26','2014-03-17 18:51:21','2014-03-17 18:51:45'] │
└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
ネストされたデータ構造は、同じ長さの複数のカラム配列のセットとして考えるのが最も簡単です。
SELECT クエリが、個別のカラムではなくネストされたデータ構造全体の名前を指定できる唯一の場所は、ARRAY JOIN 句です。詳細については、「ARRAY JOIN 句」を参照してください。例:
SELECT
Goal.ID,
Goal.EventTime
FROM test.visits
ARRAY JOIN Goals AS Goal
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goal.ID─┬──────Goal.EventTime─┐
│ 1073752 │ 2014-03-17 16:38:10 │
│ 591325 │ 2014-03-17 16:38:48 │
│ 591325 │ 2014-03-17 16:42:27 │
│ 1073752 │ 2014-03-17 00:28:25 │
│ 1073752 │ 2014-03-17 10:46:20 │
│ 1073752 │ 2014-03-17 13:59:20 │
│ 591325 │ 2014-03-17 22:17:55 │
│ 591325 │ 2014-03-17 22:18:07 │
│ 591325 │ 2014-03-17 22:18:51 │
│ 1073752 │ 2014-03-17 11:37:06 │
└─────────┴─────────────────────┘
ネストされたデータ構造全体に対して SELECT を実行することはできません。オプトインとして、その一部である個々のカラムを明示的にリストする必要があります。
INSERT クエリの場合、ネストされたデータ構造のすべてのコンポーネントカラム配列を別々に渡す必要があります(あたかもそれらが個々のカラム配列であるかのように)。挿入中、システムはそれらが同じ長さであることを確認します。
DESCRIBE クエリの場合、ネストされたデータ構造のカラムは、同じ方法で別々にリストされます。
ネストされたデータ構造内の要素に対する ALTER クエリには制限があります。