メインコンテンツまでスキップ
に最終更新

SEQUENCE_COUNT

説明​

パターンに一致するイベントチェーンの数を数えます。関数は互いに重複しないイベントチェーンを検索します。現在のチェーンが一致した後で、次のチェーンの検索を開始します。

警告!

同じ秒に発生したイベントの並び順は定義されておらず、結果に影響する場合があります。

構文​

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

パラメータ​

パラメータ説明
<pattern>パターン文字列。以下の「パターン構文」を参照してください。String 型をサポートします。
<timestamp>時刻データを含む列。Date、DateTime、TimestampNs 型をサポートします。
<cond_n>イベントチェーンを記述する条件。Bool 型をサポートします。条件引数は最大 32 個指定できます。関数は、これらの条件で記述されたイベントだけを考慮します。シーケンスに条件で記述されていないデータが含まれる場合、そのデータをスキップします。

パターン構文

  • (?N) — N 番目の条件引数に一致します。条件には [1, 32] の範囲で番号が付けられます。たとえば、(?1) は cond_1 パラメータに渡した引数に一致します。

  • .* — 任意の数のイベントに一致します。パターンのこの要素を数えるために条件引数を指定する必要はありません。

  • (?t operator value) — 二つのイベントを隔てる時間を秒単位で指定します。

  • 二つの時刻の差を秒単位で表したものを t とします。たとえば、パターン (?1)(?t>1800)(?2) は、1800 秒を超える間隔で発生したイベントに一致します。パターン (?1)(?t>10000)(?2) は、10000 秒を超える間隔で発生したイベントに一致します。これらのイベントの間には、任意の数のイベントが存在できます。>=、>、<、<=、== 演算子を使用できます。

戻り値​

パターンに一致する、互いに重複しないイベントチェーンの数を返します。 グループ内に有効なデータがない場合は 0 を返します。

使用例​

一致する例

-- 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 |
+----------------------------------------------------------------+

これは非常に単純な例です。関数は、number が 1 のイベントの後に number が 5 のイベントが続くチェーンを見つけます。間にある number が 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 |
+------------------------------------------------------------------------------+

この結果は少し分かりにくいかもしれません。この場合、number が 1 のイベントと number が 5 のイベントの間に number が 4 のイベントが発生しているため、関数はパターンに一致するイベントチェーンを見つけられません。一方、同じ状況で number が 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 |
+------------------------------------------------------------------------------+