パラメトリック集約関数
いくつかの集約関数は、引数カラム(圧縮に使用)だけでなく、一連のパラメータ(初期化用の定数)を受け取ることができます。構文は、1つのかっこではなく2つのかっこを使用します。最初のかっこはパラメータ用、2番目のかっこは引数用です。
histogram
適応ヒストグラムを計算します。正確な結果は保証されません。
この関数はA Streaming Parallel Decision Tree Algorithmを使用しています。ヒストグラムビンの境界は、新しいデータが関数に入ると調整されます。一般的な場合、ビンの幅は等しくありません。
引数
values
— 入力値を生成する式。
パラメータ
number_of_bins
— ヒストグラムのビンの上限数。この関数は自動的にビンの数を計算します。指定されたビン数に達しようとしますが、失敗した場合はより少ないビンを使用します。
返される値
例
ヒストグラムを視覚化するには、例えばbar関数を使用できます:
この場合、ヒストグラムビンの境界が不明であることを忘れないでください。
sequenceMatch
シーケンスがパターンに一致するイベントチェーンを含むかどうかをチェックします。
構文
同じ秒に発生するイベントは、順序が未定義でシーケンス内に配置される可能性があり、その結果に影響を与える場合があります。
引数
-
timestamp
— 時間データを含むカラム。一般的なデータ型はDate
およびDateTime
です。サポートされているUIntデータ型のいずれかを使用できます。 -
cond1
,cond2
— イベントのチェーンを説明する条件。データ型:UInt8
。最大32の条件引数を渡すことができます。この関数は、これらの条件で説明されたイベントのみを考慮します。シーケンスに条件で説明されていないデータが含まれている場合、関数はそれらをスキップします。
パラメータ
pattern
— パターン文字列。詳細はパターン構文を参照してください。
返される値
- パターンが一致すれば1。
- パターンが一致しなければ0。
タイプ: UInt8
.
パターン構文
-
(?N)
— 番号N
の位置にある条件引数と一致します。条件は[1, 32]
の範囲で番号付けされます。例えば、(?1)
はcond1
パラメータに渡された引数と一致します。 -
.*
— 任意の数のイベントと一致します。このパターンのこの要素と一致させるには条件引数は必要ありません。 -
(?t operator value)
— 二つのイベントの間に必要な秒数を設定します。例えば、パターン(?1)(?t>1800)(?2)
は、1800秒以上離れて発生するイベントに一致します。これらのイベントの間には任意の数のイベントが含まれる可能性があります。>=
、>
、<
、<=
、==
演算子を使用できます。
例
t
テーブルのデータを考えてみましょう:
クエリを実行します:
この関数は、number 2がnumber 1の後に続くイベントチェーンを見つけました。条件で説明されていないnumber 3がその間に存在するため、スキップされました。この例で与えられたイベントチェーンを検索する際にこの数字を考慮に入れたければ、条件を作成する必要があります。
この場合、関数はパターンに一致するイベントチェーンを見つけることができませんでした。なぜなら、number 3のイベントが1と2の間に発生したからです。同じ場合にnumber 4の条件をチェックした場合、シーケンスはパターンに一致します。
参照
sequenceCount
パターンに一致するイベントチェーンの数をカウントします。この関数は、重複しないイベントチェーンを検索します。現在のチェーンが一致した後、次のチェーンを探し始めます。
同じ秒に発生するイベントは、順序が未定義でシーケンス内に配置される可能性があり、その結果に影響を与える場合があります。
構文
引数
-
timestamp
— 時間データを含むカラム。一般的なデータ型はDate
およびDateTime
です。サポートされているUIntデータ型のいずれかを使用できます。 -
cond1
,cond2
— イベントのチェーンを説明する条件。データ型:UInt8
。最大32の条件引数を渡すことができます。この関数は、これらの条件で説明されたイベントのみを考慮します。シーケンスに条件で説明されていないデータが含まれている場合、関数はそれらをスキップします。
パラメータ
pattern
— パターン文字列。詳細はパターン構文を参照してください。
返される値
- 一致する重複しないイベントチェーンの数。
タイプ: UInt64
.
例
t
テーブルのデータを考えてみましょう:
次に、number 1の後にnumber 2が発生する回数をカウントします(その間に任意の他の数字があっても構いません):
sequenceMatchEvents
パターンに一致する最長のイベントチェーンのイベントタイムスタンプを返します。
同じ秒に発生するイベントは、順序が未定義でシーケンス内に配置される可能性があり、その結果に影響を与える場合があります。
構文
引数
-
timestamp
— 時間データを含むカラム。一般的なデータ型はDate
およびDateTime
です。サポートされているUIntデータ型のいずれかを使用できます。 -
cond1
,cond2
— イベントのチェーンを説明する条件。データ型:UInt8
。最大32の条件引数を渡すことができます。この関数は、これらの条件で説明されたイベントのみを考慮します。シーケンスに条件で説明されていないデータが含まれている場合、関数はそれらをスキップします。
パラメータ
pattern
— パターン文字列。詳細はパターン構文を参照してください。
返される値
- 一致した条件引数(?N)のイベントチェーンからのタイムスタンプの配列。配列内の位置はパターン内の条件引数の位置に対応します。
タイプ: 配列。
例
t
テーブルのデータを考えてみましょう:
最長チェーンのイベントのタイムスタンプを返します:
参照
windowFunnel
スライディングウィンドウ内のイベントチェーンを検索し、チェーンから発生した最大イベント数を計算します。
この関数は以下のアルゴリズムに従って動作します:
-
関数は、チェーン内の最初の条件をトリガーするデータを検索し、イベントカウンタを1に設定します。これがスライディングウィンドウの開始時点です。
-
チェーン内のイベントがウィンドウ内で連続して発生した場合、カウンタが増加します。イベントのシーケンスが中断された場合、カウンタは増加しません。
-
データに複数のイベントチェーンが異なる完了ポイントで存在する場合、関数は最長のチェーンのサイズのみを出力します。
構文
引数
timestamp
— タイムスタンプを含むカラムの名前。サポートされているデータ型: Date、DateTime およびその他の符号なし整数型(タイムスタンプがUInt64
型をサポートしているものの、その値はInt64の最大値である2^63 - 1を超えてはならないことに注意してください)。cond
— 条件またはイベントチェーンを説明するデータ。 UInt8。
パラメータ
window
— スライディングウィンドウの長さ。これは最初の条件と最後の条件の間の時間間隔です。window
の単位はtimestamp
自体によって異なり、次の式で決定されます:timestamp of cond1 <= timestamp of cond2 <= ... <= timestamp of condN <= timestamp of cond1 + window
。mode
— オプションの引数。1つ以上のモードを設定できます。'strict_deduplication'
— シーケンス内のイベントに対して同じ条件が成立した場合、そのような繰り返しイベントはさらなる処理を中断します。注意: 複数の条件が同じイベントに当てはまると予期しない動作をすることがあります。'strict_order'
— 他のイベントの介入を許可しません。例えば、A->B->D->C
の場合、D
でA->B->C
の検索が停止し、最大イベントレベルは2になります。'strict_increase'
— 厳密に増加するタイムスタンプを持つイベントのみを対象とします。'strict_once'
— チェーン内で条件を満たしたイベントを一度だけカウントします、たとえ条件を複数回満たしたとしても。
返される値
スライディングウィンドウ内のチェーンから連続してトリガーされた条件の最大数。 選択されたすべてのチェーンが分析されます。
タイプ: Integer
.
例
ユーザーがオンラインストアで電話を選択して購入するのに十分な期間かどうかを判断します。
次のイベントチェーンを設定します:
- ユーザーがストアのアカウントにログインしました(
eventID = 1003
)。 - ユーザーが電話を検索しました(
eventID = 1007, product = 'phone'
)。 - ユーザーが注文を出しました(
eventID = 1009
)。 - ユーザーが再度注文を出しました(
eventID = 1010
)。
入力テーブル:
ユーザーuser_id
が2019年1月から2月の間にチェーンを通過した場合、どの地点まで到達できるかを調べます。
クエリ:
結果:
retention
この関数は、イベントに対して特定の条件が満たされたかどうかを示す1〜32の引数のセットを引数として受け取ります。 任意の条件を引数として指定できます(WHEREと同様)。
最初の条件を除いて、条件はペアで適用されます: 2番目の条件の結果は、最初と2番目の条件が真であれば真になります。3番目の条件は、最初と3番目の条件が真であれば真になります。等々。
構文
引数
cond
—UInt8
(1または0)結果を返す式。
返される値
1または0の配列。
- 1 — イベントに対して条件が満たされた。
- 0 — イベントに対して条件が満たされなかった。
タイプ: UInt8
.
例
サイトのトラフィックを判断するためのretention
関数の計算の例を考えてみましょう。
1. 例を示すためのテーブルを作成します。
入力テーブル:
クエリ:
結果:
2. retention
関数を使用して、ユニークID uid
でユーザーをグループ化します。
クエリ:
結果:
3. 日ごとのサイト訪問者数を合計します。
クエリ:
結果:
ここで:
r1
- 2020-01-01の間にサイトを訪れたユニークな訪問者の数(cond1
条件)。r2
- 2020-01-01から2020-01-02の間にサイトを訪れた特定の時間帯のユニークな訪問者の数(cond1
およびcond2
条件)。r3
- 2020-01-01および2020-01-03の間にサイトを訪れた特定の時間帯のユニークな訪問者の数(cond1
およびcond3
条件)。
uniqUpTo(N)(x)
指定された制限N
までの引数の異なる値の数を計算します。引数の異なる値の数がN
を超える場合、この関数はN
+ 1を返します。そうでない場合は、正確な値を計算します。
小さなN
(最大10)の使用が推奨されます。N
の最大値は100です。
集約関数の状態について、この関数は1 + N
* 値のバイト数に等しい量のメモリを使用します。
文字列を扱う場合、この関数は8バイトの非暗号化ハッシュを保存し、文字列に対して計算を近似します。
例えば、ユーザーがウェブサイトで行ったすべての検索クエリをログに記録するテーブルがあるとしましょう。テーブルの各行は単一の検索クエリを表し、ユーザーID、検索クエリ、およびクエリのタイムスタンプのカラムがあります。uniqUpTo
を使用して、少なくとも5人のユニークユーザーが使用したキーワードのみを表示するレポートを生成できます。
uniqUpTo(4)(UserID)
は各SearchPhrase
についてユニークなUserID
の数を計算しますが、最大で4つのユニーク値のみをカウントします。4つを超えるユニークなUserID
の値がある場合、この関数は5を返します(4 + 1)。その後、HAVING
句は、ユニークなUserID
の値が5未満であるSearchPhrase
の値をフィルタリングします。これにより、少なくとも5人のユニークユーザーが使用した検索キーワードのリストが得られます。
sumMapFiltered
この関数はsumMapと同様に動作しますが、フィルタリングするためのキーの配列も受け入れます。これは、高い基数のキーで作業する際に特に役立ちます。
構文
sumMapFiltered(keys_to_keep)(keys, values)
パラメータ
返される値
- 並べ替えられた順序のキーと、対応するキーに対して合計された値の2つの配列のタプルを返します。
例
クエリ:
結果:
sumMapFilteredWithOverflow
この関数はsumMapと同様に動作しますが、フィルタリングするためのキーの配列も受け入れます。これは、高い基数のキーで作業する際に特に役立ちます。sumMapFiltered関数と異なり、オーバーフロー付きの合計を行います。つまり、引数のデータ型と同じデータ型で合計を返します。
構文
sumMapFilteredWithOverflow(keys_to_keep)(keys, values)
パラメータ
返される値
- 並べ替えられた順序のキーと、対応するキーに対して合計された値の2つの配列のタプルを返します。
例
この例では、テーブルsum_map
を作成し、データを挿入し、sumMapFilteredWithOverflow
とsumMapFiltered
およびtoTypeName
関数を使用して結果を比較します。requests
が作成されたテーブルでUInt8
型であった場合、sumMapFiltered
はオーバーフローを避けるために合計値の型をUInt64
に昇格させるのに対し、sumMapFilteredWithOverflow
は型をそのままUInt8
のまま保持します。つまり、オーバーフローが発生します。
クエリ:
結果:
sequenceNextNode
イベントチェーンに一致する次のイベントの値を返します。
実験的な関数です。 SET allow_experimental_funnel_functions = 1
を使用して有効にします。
構文
パラメータ
-
direction
— 方向を指定するために使用します。- forward — 前方に移動します。
- backward — 後方に移動します。
-
base
— 基準点を設定するために使用します。- head — 基準点を最初のイベントに設定します。
- tail — 基準点を最後のイベントに設定します。
- first_match — 基準点を最初に一致した
event1
に設定します。 - last_match — 基準点を最後に一致した
event1
に設定します。
引数
timestamp
— タイムスタンプを含むカラムの名前。サポートされているデータ型: Date, DateTime とその他の符号なし整数型。event_column
— 返される次のイベントの値を含むカラムの名前。サポートされているデータ型: String と Nullable(String)。base_condition
— 基準点が満たさなければならない条件。event1
,event2
, ... — イベントのチェーンを説明する条件。 UInt8。
返される値
event_column[next_index]
— パターンが一致し、次の値が存在する場合。NULL
- パターンが一致しないか、次の値が存在しない場合。
型: Nullable(String)。
例
イベントが A->B->C->D->E の場合に、B->C の後のイベント(D)を知りたいときに使用できます。
A->Bの後のイベントを検索するクエリ文:
結果:
forward
と head
の動作
backward
と tail
の動作
forward
と first_match
の動作
backward
と last_match
の動作
base_condition
の動作