SEQUENCE_MATCH
설명
시퀀스에 패턴과 일치하는 이벤트 체인이 포함되어 있는지 확인합니다.
경고!
같은 초에 발생한 이벤트는 시퀀스 내에서 순서가 정해지지 않을 수 있으며, 이로 인해 결과가 달라질 수 있습니다.
구문
SEQUENCE_MATCH(<pattern>, <timestamp>, <cond_1> [, <cond_2>, ..., <cond_n>])
매개변수
| 매개변수 | 설명 |
|---|---|
<pattern> | 패턴 문자열입니다. 아래의 패턴 구문을 참조하세요. String 타입을 지원합니다. |
<timestamp> | 시간 데이터를 포함하는 것으로 간주되는 컬럼입니다. Date, DateTime, TimestampNs 타입을 지원합니다. |
<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 |
+----------------------------------------------------------------+
매우 간단한 예제입니다. 함수는 number 값이 5인 이벤트가 number 값이 1인 이벤트 뒤에 나타나는 이벤트 체인을 찾았습니다. 그 사이의 number 값이 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 |
+------------------------------------------------------------------------------+
결과가 다소 혼란스러울 수 있습니다. 이 경우에는 number 값이 4인 이벤트가 1과 5 사이에 발생했기 때문에 함수가 패턴과 일치하는 이벤트 체인을 찾지 못했습니다. 같은 상황에서 number 값이 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 |
+------------------------------------------------------------------------------+