SEQUENCE_MATCH
Описание
Проверяет, содержит ли последовательность цепочку событий, соответствующую шаблону.
ВНИМАНИЕ!
События, происходящие в одну и ту же секунду, могут располагаться в последовательности в неопределённом порядке, что влияет на результат.
Синтаксис
SEQUENCE_MATCH(<pattern>, <timestamp>, <cond_1> [, <cond_2>, ..., <cond_n>])
Параметры
| Параметр | Описание |
|---|---|
<pattern> | Строка шаблона. См. Синтаксис шаблона ниже. Поддерживается тип String. |
<timestamp> | Столбец, содержащий данные о времени. Поддерживаются типы Date, DateTime. |
<cond_n> | Условия, описывающие цепочку событий. Поддерживается тип Bool. Можно передать до 32 аргументов условий. Функция учитывает только события, описанные этими условиями. Если последовательность содержит данные, не описанные ни одним условием, функция пропускает их. |
Синтаксис шаблона
-
(?N)— Соответствует аргументу условия в позиции N. Условия нумеруются в диапазоне[1, 32]. Например,(?1)соответствует аргументу, переданному в параметрcond1. -
.*— Соответствует любому количеству событий. Для сопоставления с этим элементом шаблона аргументы условий не нужны. -
(?t operator value)— Задаёт интервал в секундах, который должен разделять два события. -
Обозначим через
tразницу в секундах между двумя моментами времени. Например, шаблон(?1)(?t>1800)(?2)соответствует событиям, которые происходят с интервалом более 1800 секунд. Шаблон(?1)(?t>10000)(?2)соответствует событиям, которые происходят с интервалом более 10000 секунд. Между этими событиями может находиться произвольное количество любых событий. Можно использовать операторы>=,>,<,<=,==.
Возвращаемое значение
1: если найдено соответствие шаблону.
0: если соответствие шаблону не найдено. Если в группе нет допустимых данных, возвращает NULL.
Примеры
Примеры соответствия шаблону
CREATE TABLE sequence_match_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 INTO sequence_match_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);
SELECT
sequence_match('(?1)(?2)', date, number = 1, number = 3) as c1,
sequence_match('(?1)(?2)', date, number = 1, number = 2) as c2,
sequence_match('(?1)(?t>=3600)(?2)', date, number = 1, number = 2) as c3
FROM sequence_match_test1;
+------+------+------+
| c1 | c2 | c3 |
+------+------+------+
| 1 | 1 | 1 |
+------+------+------+
Примеры несоответствия шаблону
CREATE TABLE sequence_match_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 INTO sequence_match_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);
SELECT
sequence_match('(?1)(?2)', date, number = 1, number = 2) as c1,
sequence_match('(?1)(?2).*', date, number = 1, number = 2) as c2,
sequence_match('(?1)(?t>3600)(?2)', date, number = 1, number = 7) as c3
FROM sequence_match_test2;
+------+------+------+
| c1 | c2 | c3 |
+------+------+------+
| 0 | 0 | 0 |
+------+------+------+
Особые примеры
CREATE TABLE sequence_match_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 INTO sequence_match_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);
SELECT sequence_match('(?1)(?2)', date, number = 1, number = 5)
FROM sequence_match_test3;
+----------------------------------------------------------------+
| sequence_match('(?1)(?2)', `date`, `number` = 1, `number` = 5) |
+----------------------------------------------------------------+
| 1 |
+----------------------------------------------------------------+
Это очень простой пример. Функция нашла цепочку событий, в которой число 5 следует за числом 1. Она пропустила числа 7, 3, 4 между ними, поскольку они не описаны как события. Если мы хотим учитывать такое число при поиске цепочки событий из примера, для него нужно добавить условие.
Теперь выполните этот запрос:
SELECT sequence_match('(?1)(?2)', date, number = 1, number = 5, number = 4)
FROM sequence_match_test3;
+------------------------------------------------------------------------------+
| sequence_match('(?1)(?2)', `date`, `number` = 1, `number` = 5, `number` = 4) |
+------------------------------------------------------------------------------+
| 0 |
+------------------------------------------------------------------------------+
Результат может показаться неожиданным. В этом случае функция не смогла найти цепочку событий, соответствующую шаблону, поскольку событие для числа 4 произошло между событиями для чисел 1 и 5. Если бы в том же случае мы проверяли условие для числа 6, последовательность соответствовала бы шаблону.
SELECT sequence_match('(?1)(?2)', date, number = 1, number = 5, number = 6)
FROM sequence_match_test3;
+------------------------------------------------------------------------------+
| sequence_match('(?1)(?2)', `date`, `number` = 1, `number` = 5, `number` = 6) |
+------------------------------------------------------------------------------+
| 1 |
+------------------------------------------------------------------------------+