メインコンテンツまでスキップ
バージョン: 2.1

SEQUENCE_COUNT

説明

パターンにマッチしたイベントチェーンの数を計数します。この関数は重複しないイベントチェーンを検索します。現在のチェーンがマッチした後、次のチェーンの検索を開始します。

警告!

同じ秒に発生するイベントは、未定義の順序でシーケンス内に配置される可能性があり、結果に影響を与える場合があります。

構文

SEQUENCE_COUNT(<pattern>, <timestamp>, <cond_1> [, <cond_2>, ..., <cond_n>]);

パラメータ

Parameterデスクリプション
<pattern>パターン文字列。以下のパターン構文を参照してください。
<timestamp>時間データを含むと見なされるカラム。一般的なデータ型はDateDateTimeです。サポートされているUIntデータ型のいずれかも使用できます。
<cond_n>イベントの連鎖を記述する条件。データ型:UInt8。最大32個の条件引数を渡すことができます。この関数はこれらの条件で記述されたイベントのみを考慮に入れます。シーケンスに条件で記述されていないデータが含まれている場合、関数はそれらをスキップします。

パターン構文

  • (?N) — 位置Nの条件引数にマッチします。条件は[1, 32]の範囲で番号が付けられます。例えば、(?1)cond_1パラメータに渡される引数にマッチします。

  • .* — 任意の数のイベントにマッチします。パターンのこの要素を数えるのに条件引数は必要ありません。

  • (?t operator value) — 2つのイベントを分離すべき時間を秒単位で設定します。

  • 2つの時間の差を秒単位でtとして定義します。例えば、パターン(?1)(?t>1800)(?2)は1800秒を超えて離れて発生するイベントにマッチします。パターン(?1)(?t>10000)(?2)は10000秒を超えて離れて発生するイベントにマッチします。これらのイベントの間には任意の数の任意のイベントを配置できます。>=><<===演算子を使用できます。

戻り値

マッチした重複しないイベントチェーンの数。

マッチング例

-- Create sample table
CREATE TABLE sequence_count_test1(
`uid` int COMMENT 'user id',
`date` datetime COMMENT 'date time',
`number` int NULL COMMENT 'number'
) DUPLICATE KEY(uid)
DISTRIBUTED BY HASH(uid) BUCKETS AUTO
PROPERTIES (
"replication_num" = "1"
);

-- Insert sample data
INSERT INTO sequence_count_test1(uid, date, number) values
(1, '2022-11-02 10:41:00', 1),
(2, '2022-11-02 13:28:02', 2),
(3, '2022-11-02 16:15:01', 1),
(4, '2022-11-02 19:05:04', 2),
(5, '2022-11-02 20:08:44', 3);

-- Query example
SELECT
SEQUENCE_COUNT('(?1)(?2)', date, number = 1, number = 3) as c1,
SEQUENCE_COUNT('(?1)(?2)', date, number = 1, number = 2) as c2,
SEQUENCE_COUNT('(?1)(?t>=3600)(?2)', date, number = 1, number = 2) as c3
FROM sequence_count_test1;
+------+------+------+
| c1 | c2 | c3 |
+------+------+------+
| 1 | 2 | 2 |
+------+------+------+

適合しない例

-- Create sample table
CREATE TABLE sequence_count_test2(
`uid` int COMMENT 'user id',
`date` datetime COMMENT 'date time',
`number` int NULL COMMENT 'number'
) DUPLICATE KEY(uid)
DISTRIBUTED BY HASH(uid) BUCKETS AUTO
PROPERTIES (
"replication_num" = "1"
);

-- Insert sample data
INSERT INTO sequence_count_test2(uid, date, number) values
(1, '2022-11-02 10:41:00', 1),
(2, '2022-11-02 11:41:00', 7),
(3, '2022-11-02 16:15:01', 3),
(4, '2022-11-02 19:05:04', 4),
(5, '2022-11-02 21:24:12', 5);

-- Query example
SELECT
SEQUENCE_COUNT('(?1)(?2)', date, number = 1, number = 2) as c1,
SEQUENCE_COUNT('(?1)(?2).*', date, number = 1, number = 2) as c2,
SEQUENCE_COUNT('(?1)(?t>3600)(?2)', date, number = 1, number = 7) as c3
FROM sequence_count_test2;
+------+------+------+
| c1 | c2 | c3 |
+------+------+------+
| 0 | 0 | 0 |
+------+------+------+

特殊な例

-- Create sample table
CREATE TABLE sequence_count_test3(
`uid` int COMMENT 'user id',
`date` datetime COMMENT 'date time',
`number` int NULL COMMENT 'number'
) DUPLICATE KEY(uid)
DISTRIBUTED BY HASH(uid) BUCKETS AUTO
PROPERTIES (
"replication_num" = "1"
);

-- Insert sample data
INSERT INTO sequence_count_test3(uid, date, number) values
(1, '2022-11-02 10:41:00', 1),
(2, '2022-11-02 11:41:00', 7),
(3, '2022-11-02 16:15:01', 3),
(4, '2022-11-02 19:05:04', 4),
(5, '2022-11-02 21:24:12', 5);

-- Query example
SELECT SEQUENCE_COUNT('(?1)(?2)', date, number = 1, number = 5) FROM sequence_count_test3;
+----------------------------------------------------------------+
| sequence_count('(?1)(?2)', `date`, `number` = 1, `number` = 5) |
+----------------------------------------------------------------+
| 1 |
+----------------------------------------------------------------+

これは非常にシンプルな例です。この関数は、数値5が数値1に続くイベントチェーンを見つけました。この関数は、それらの間にある数値7,3,4をスキップしました。これは、その数値がイベントとして記述されていないためです。例で示されたイベントチェーンを検索する際にこの数値を考慮したい場合は、そのための条件を作成する必要があります。

では、このクエリを実行してください:

SELECT SEQUENCE_COUNT('(?1)(?2)', date, number = 1, number = 5, number = 4) FROM sequence_count_test3;
+------------------------------------------------------------------------------+
| sequence_count('(?1)(?2)', `date`, `number` = 1, `number` = 5, `number` = 4) |
+------------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------------+

結果は少し混乱を招きます。この場合、数値4のイベントが1と5の間で発生したため、関数はパターンに一致するイベントチェーンを見つけることができませんでした。同じケースで数値6の条件をチェックした場合、シーケンスはパターンをカウントします。

SELECT SEQUENCE_COUNT('(?1)(?2)', date, number = 1, number = 5, number = 6) FROM sequence_count_test3;
+------------------------------------------------------------------------------+
| sequence_count('(?1)(?2)', `date`, `number` = 1, `number` = 5, `number` = 6) |
+------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------+