MATCH_RECOGNIZE
MATCH_RECOGNIZE (행 패턴 인식)
일련의 행에서 패턴을 감지하는 데 쓰는 FROM 절의 선택적 하위 절이에요. 복잡한 이벤트 시퀀스를 분석할 때 정규식처럼 행에 패턴을 매칭해 정보를 뽑아낼 수 있어요.
출처: 문서
본문
MATCH_RECOGNIZE 절은 FROM 절의 선택적 하위 절이에요. 행 집합에서 패턴을 감지하는 데 사용돼요. 관심 있는 패턴은 정규식을 기반으로 한 행 패턴 문법으로 지정해요. 패턴 매칭의 입력은 테이블, 뷰, 서브쿼리예요. 감지된 각 일치에 대해 하나 이상의 행이 반환되며, 그 행들은 일치에 대한 요청된 정보를 담아요.
행 패턴 매칭은 복잡한 이벤트 시퀀스를 분석할 때 강력한 도구예요. 다음 예시들은 전형적인 사용 사례를 보여줘요:
- 거래 애플리케이션에서 추세 추적이나 특정 행동 패턴을 가진 고객 식별
- 배송 애플리케이션에서 가능한 모든 유효 경로를 따라 패키지 추적
- 금융 애플리케이션에서 사기를 암시할 수 있는 비정상적인 사건 감지
예시
다음 예시에서 패턴은 totalprice 컬럼에 대한 V자 모양을 설명해요. 고객이 한 주문이 가격이 먼저 내려간 뒤 시작 지점을 지나 올라갈 때마다 일치가 발견돼요:
SELECT * FROM orders MATCH_RECOGNIZE(
PARTITION BY custkey
ORDER BY orderdate
MEASURES
A.totalprice AS starting_price,
LAST(B.totalprice) AS bottom_price,
LAST(U.totalprice) AS top_price
ONE ROW PER MATCH
AFTER MATCH SKIP PAST LAST ROW
PATTERN (A B+ C+ D+)
SUBSET U = (C, D)
DEFINE
B AS totalprice < PREV(totalprice),
C AS totalprice > PREV(totalprice) AND totalprice <= A.totalprice,
D AS totalprice > PREV(totalprice)
)
이어지는 섹션에서 MATCH_RECOGNIZE 절의 모든 하위 절을 이 예시 쿼리로 설명해요.
분할과 정렬
PARTITION BY custkey
PARTITION BY 절은 입력 테이블을 별도 섹션으로 나눠, 각 섹션을 독립적으로 처리해 패턴 매칭을 하게 해요. 분할 선언이 없으면 전체 입력 테이블이 사용돼요. 이 동작은 윈도우 사양의 PARTITION BY 절의 의미와 유사해요. 예시에서 orders 테이블은 custkey 값으로 분할되므로, 특정 고객의 모든 주문에 대해 다른 고객의 주문과 독립적으로 패턴 매칭이 수행돼요.
ORDER BY orderdate
선택적인 ORDER BY 절은 일반적으로 정렬된 데이터 집합에서 매칭할 수 있게 해줘요. 예를 들어 입력을 orderdate로 정렬하면 시간에 따른 변화 추세에 대해 매칭할 수 있어요.
행 패턴 measure
MEASURES 절은 일치한 행 시퀀스에서 어떤 정보를 검색할지 지정하게 해요.
MEASURES measure_expression AS measure_name [, ...]
measure 표현식은 일치에 기반해 값이 계산되는 스칼라 표현식이에요. 예시에서 행 패턴 measure가 세 개 지정돼 있어요:
A.totalprice AS starting_price는 일치의 첫 번째 행에 있는 가격을 반환해요. 그 행은 패턴에 따라 A와 연관된 유일한 행이에요.
LAST(B.totalprice) AS bottom_price는 가장 낮은 가격(패턴의 "V" 아래쪽에 해당)을 반환해요. B와 연관된 마지막 행, 즉 하강 구간의 마지막 행의 가격이에요.
LAST(U.totalprice) AS top_price는 일치에서 가장 높은 가격을 반환해요. C나 D와 연관된 마지막 행, 즉 일치의 마지막 행의 가격이에요.
measure 표현식은 입력 테이블의 컬럼을 참조할 수 있어요. 또한 입력 정보를 일치의 세부 사항과 결합하는 특수 문법을 허용해요(행 패턴 인식 표현식 참고).
각 measure는 패턴 인식의 출력 컬럼을 정의해요. 컬럼은 measure_name으로 참조할 수 있어요.
MEASURES 절은 선택적이에요. measure를 지정하지 않으면 특정 입력 컬럼(ROWS PER MATCH 절에 따라 다름)이 패턴 인식의 출력이 돼요.
매치당 행 수 (Rows per match)
이 절은 출력 행의 수를 지정하는 데 사용할 수 있어요. 두 가지 주요 옵션이 있어요:
ONE ROW PER MATCH
그리고
ALL ROWS PER MATCH
ONE ROW PER MATCH가 기본 옵션이에요. 각 일치에 대해 단일 출력 행이 생성돼요. 출력은 PARTITION BY 컬럼과 measure로 구성돼요. 빈 일치에 대해서도 시작 행을 기준으로 출력이 생성돼요. 일치하지 않는 행(즉, 어떤 비어 있지 않은 일치에도 포함되지 않고 빈 일치의 시작 행도 아닌 행)은 출력에 포함되지 않아요.
ALL ROWS PER MATCH의 경우 일치의 각 행이 배제 문법으로 출력에서 제외되지 않으면 출력 행을 생성해요. 출력은 PARTITION BY 컬럼, ORDER BY 컬럼, measure, 입력 테이블의 나머지 컬럼으로 구성돼요. 기본적으로 빈 일치는 표시되고 일치하지 않는 행은 건너뛰어지며, 이는 ONE ROW PER MATCH 옵션과 비슷해요. 다만 이 동작은 수정자로 바꿀 수 있어요:
ALL ROWS PER MATCH SHOW EMPTY MATCHES
빈 일치를 표시하고 일치하지 않는 행을 건너뛰며, 기본과 같아요.
ALL ROWS PER MATCH OMIT EMPTY MATCHES
빈 일치를 출력에서 제외해요.
ALL ROWS PER MATCH WITH UNMATCHED ROWS
빈 일치를 표시하고 각 일치하지 않는 행에 대해 추가 출력 행을 생성해요.
빈 일치와 일치하지 않는 행에 대한 행 패턴 measure 계산에는 특별한 규칙이 있어요. 이 규칙은 빈 일치와 일치하지 않는 행의 표현식 평가에서 설명돼요.
일치하지 않는 행은 패턴이 빈 일치를 허용하지 않을 때만 발생할 수 있어요. 그렇지 않으면 빈 일치의 시작 행으로 간주돼요. ALL ROWS PER MATCH WITH UNMATCHED ROWS 옵션은 패턴 인식이 모든 입력 행을 통과시킬 것으로 예상되고, 패턴이 빈 일치를 허용하는지 확실하지 않을 때 권장돼요.
매치 후 건너뛰기 (After match skip)
AFTER MATCH SKIP 절은 비어 있지 않은 일치를 찾은 후 패턴 매칭을 어디서 재개할지 지정해요.
기본 옵션은:
AFTER MATCH SKIP PAST LAST ROW
이 옵션으로 패턴 매칭은 일치의 마지막 행 다음 행부터 시작해요. 겹치는 일치는 감지되지 않아요.
다음 옵션으로 패턴 매칭은 일치의 두 번째 행부터 시작해요:
AFTER MATCH SKIP TO NEXT ROW
예시에서 V자 모양이 감지되면, "V"의 하강 경사면에 있는 연속된 행에서 시작하는 추가 겹침 일치가 발견돼요. 다음 행으로 건너뛰는 것은 빈 일치나 일치하지 않는 행을 감지한 후의 기본 동작이에요.
다음 AFTER MATCH SKIP 옵션들은 패턴의 구성 요소를 기반으로 패턴 매칭을 재개하게 해요. 패턴 매칭은 특정 행 패턴 변수에 일치한 마지막(기본) 또는 첫 번째 행에서 시작해요. 그것은 기본 패턴 변수(행 패턴 문법에서 설명) 또는 union 변수일 수 있어요:
AFTER MATCH SKIP TO [ FIRST | LAST ] pattern_variable
현재 일치의 첫 번째 행으로 건너뛰는 것은 무한 루프를 만들기 때문에 금지돼요. 예를 들어 AFTER MATCH SKIP TO A를 지정하면 실패하는데, A가 패턴의 첫 번째 요소이고 그곳으로 다시 점프하면 무한 루프가 생기기 때문이에요. 마찬가지로 일치에 없는 패턴 변수로 건너뛰는 것도 실패를 일으켜요.
기본 AFTER MATCH SKIP PAST LAST ROW를 제외한 모든 다른 옵션은 겹치는 일치를 감지할 수 있게 해요. ALL ROWS PER MATCH WITH UNMATCHED ROWS와 AFTER MATCH SKIP PAST LAST ROW의 조합만이 각 입력 행에 대해 정확히 하나의 출력 행을 보장하는 유일한 구성이에요.
행 패턴 문법
행 패턴은 행 패턴 인식에 특화된 일부 문법 확장이 있는 정규식의 한 형태예요. PATTERN 절에서 지정해요:
PATTERN ( row_pattern )
행 패턴의 기본 요소는 기본 패턴 변수(primary pattern variable)예요. 문자 문자열의 패턴 매칭이 문자를 검색하는 것처럼, 행 시퀀스의 패턴 매칭은 특정 기본 패턴 변수로 "라벨"될 수 있는 행을 검색해요. 기본 패턴 변수는 식별자 형태이며 boolean 조건으로 정의돼요. 이 조건은 특정 입력 행이 이 변수에 매핑되어 일치에 참여할 수 있는지를 결정해요.
예시 PATTERN (A B+ C+ D+)에는 A, B, C, D 네 개의 기본 패턴 변수가 있어요.
행 패턴 문법은 다음 사용을 포함해요:
연결 (concatenation)
A B+ C+ D+
구성 요소 사이에 연산자 없이 이어진 시퀀스예요. 모든 구성 요소가 지정된 순서대로 일치돼요.
선택 (alternation)
A | B | C
|로 구분된 구성 요소 시퀀스예요. 구성 요소 중 정확히 하나가 일치돼요. 여러 구성 요소를 일치시킬 수 있으면 가장 왼쪽 일치 구성 요소가 선택돼요.
순열 (permutation)
PERMUTE(A, B, C)
구성 요소의 모든 순열의 선택과 동등해요. 모든 구성 요소가 어떤 순서로 일치돼요. 구성 요소의 다른 순서에 대해 여러 일치가 가능하면, PERMUTE 목록의 구성 요소 순서가 정하는 사전식 순서에 따라 일치가 선택돼요. 위 예시에서 가장 선호되는 옵션은 A B C이고, 가장 덜 선호되는 옵션은 C B A예요.
그룹화 (grouping)
(A B C)
파티션 시작 앵커
^
파티션 끝 앵커
$
빈 패턴
()
배제 문법 (exclusion)
{- row_pattern -}
배제 문법은 일치의 일부를 출력에서 제외하도록 지정하는 데 사용돼요. 일치의 특정 구간만 중요할 때 ALL ROWS PER MATCH 옵션과 결합해 유용해요.
예시를 ALL ROWS PER MATCH로 바꾸고 패턴을 PATTERN (A {- B+ C+ -} D+)로 수정하면, 결과는 초기 일치 행과 뒤따르는 행 구간으로 구성돼요.
패턴 배제를 지정해도 MEASURES와 DEFINE 절의 표현식 계산에는 영향을 주지 않아요. 배제는 패턴 매칭에도 영향을 주지 않아요. 괄호로 묶는 일반 그룹화와 같은 의미를 가져요.
ALL ROWS PER MATCH WITH UNMATCHED ROWS 옵션과 함께 패턴 배제를 지정하는 것은 금지돼요.
수량자 (quantifiers)
패턴 수량자는 일치에서 하위 패턴의 원하는 반복 횟수를 지정하게 해요. 관련 패턴 구성 요소 뒤에 추가돼요:
(A | B)*
다음 행 패턴 수량자가 있어요:
- 0회 이상 반복:
*
- 1회 이상 반복:
+
- 0회 또는 1회 반복:
?
- 비음수 정수로 지정한 정확한 반복 횟수:
{n}
- 비음수 정수로 지정한 범위 내 반복 횟수:
{m, n}
범위 지정은 선택적이에요. 왼쪽 경계를 생략하면 기본값은 0이에요. 그래서 {, 5}는 "0회에서 5회 반복"으로 설명할 수 있어요. 오른쪽 경계를 생략하면 허용되는 반복 횟수는 무제한이에요. 그래서 {5, }는 "최소 5회 반복"으로 설명할 수 있어요. 또한 {,}는 *와 동등해요.
수량자는 기본적으로 탐욕적(greedy)이에요. 즉 더 많은 반복 횟수가 더 적은 수보다 선호된다는 뜻이에요. 이 동작은 수량자 바로 뒤에 ?를 붙이면 비탐욕적(reluctant)으로 바꿀 수 있어요. {3, 5}에서는 3회 반복이 가장 덜 선호되고 5회 반복이 가장 선호돼요. {3, 5}?에서는 3회 반복이 가장 선호돼요. 마찬가지로 ?는 1회 반복을 선호하고, ??는 0회 반복을 선호해요.
행 패턴 union 변수
행 패턴 문법에서 설명한 대로, 기본 패턴 변수는 행 패턴의 기본 요소예요. 기본 패턴 변수에 더해 union 변수를 정의할 수 있어요. union 변수는 SUBSET 절에서 도입돼요:
SUBSET U = (C, D), ...
위 예시에서 union 변수 U는 기본 변수 C와 D의 합집합으로 정의돼요. union 변수는 MEASURES, DEFINE, AFTER MATCH SKIP 절에서 유용해요. 부분 집합의 어느 기본 변수와도 일치한 행 집합을 참조하게 해줘요.
PATTERN((A | B){5} C+) 패턴에서는 일치가 A나 B를 포함하는지 미리 정할 수 없어요. union 변수로 A나 B 중 하나와 일치한 마지막 행에 접근할 수 있어요. SUBSET U = (A, B)를 정의하고 표현식 LAST(U.totalprice)는 A나 B에 매핑된 마지막 행의 totalprice 컬럼 값을 반환해요. 또한 A나 B가 일치에 없으면 AFTER MATCH SKIP TO LAST A나 AFTER MATCH SKIP TO LAST B가 실패할 수 있어요. AFTER MATCH SKIP TO LAST U는 실패하지 않아요.
행 패턴 변수 정의
DEFINE 절은 행 패턴 기본 변수가 정의되는 곳이에요. 각 변수는 boolean 조건과 연관돼요:
DEFINE B AS totalprice < PREV(totalprice), ...
패턴 매칭 중 특정 변수가 일치의 다음 단계로 고려되면, 현재 일치의 맥락에서 boolean 조건이 평가돼요. 결과가 true면 변수로 "라벨"된 현재 행이 일치의 일부가 돼요.
위 예시에서 패턴이 어떤 시점에서 B를 일치시키는 것을 허용한다고 가정해요. 일부 행이 이미 일부 패턴 변수에 일치해 있어요. 이제 변수 B가 현재 행에 대해 고려되고 있어요. 일치가 만들어지기 전에 B에 대한 정의 조건이 평가돼요. 이 예시에서 그 조건은 현재 행의 totalprice 컬럼 값이 앞 행의 totalprice보다 낮을 때만 참이에요.
변수를 행에 매칭하는 메커니즘은 행 시퀀스의 패턴 매칭과 텍스트의 정규식 매칭 사이의 차이를 보여줘요. 텍스트에서는 문자가 항상 자신의 위치에 남아 있어요. 행 패턴 매칭에서는 행이 일치의 앞부분과 심지어 일치 번호에 따라 다른 일치에서 다른 변수에 매핑될 수 있어요.
모든 기본 변수가 DEFINE 절에 정의를 가질 필요는 없어요. DEFINE 절에 언급되지 않은 변수는 true 조건과 암시적으로 연관돼, 모든 행에 일치시킬 수 있다는 뜻이에요.
DEFINE 절의 boolean 표현식은 MEASURES 절의 표현식과 같은 특수 문법을 허용해요. 자세한 내용은 행 패턴 인식 표현식에서 설명돼요.
행 패턴 인식 표현식
MEASURES와 DEFINE 절의 표현식은 입력 테이블의 행에 대해 평가되는 스칼라 표현식이에요. 패턴 인식 맥락에 특화된 특수 문법을 지원해요. 입력 정보를 현재 일치에 대한 정보와 결합할 수 있어요. 특수 문법으로 행에 할당된 패턴 변수에 접근하고, 행이 어떻게 일치됐는지에 따라 행을 탐색하며, 일치의 순차 번호를 참조할 수 있어요.
패턴 변수 참조
A.totalprice
U.orderdate
orderstatus
패턴 변수가 접두사로 붙은 컬럼 이름은 이 변수에 일치한 모든 행에서 이 컬럼의 값을 참조하며, union 변수의 경우 부분 집합의 어떤 변수든 참조해요. 컬럼 이름에 접두사가 없으면 모든 기본 패턴 변수의 합집합으로 정의된 보편 패턴 변수(universal pattern variable)가 붙은 것으로 간주돼요. 다시 말해 접두사 없는 컬럼 이름은 현재 일치의 모든 행을 참조해요.
패턴 인식 맥락에서 컬럼 이름에 테이블 이름을 접두사로 붙이는 것은 금지돼요.
classifier 함수
CLASSIFIER()
CLASSIFIER(A)
CLASSIFIER(U)
classifier 함수는 행과 연관된 기본 패턴 변수를 반환해요. 반환 타입은 varchar예요. 선택적 인자는 패턴 변수예요. 접두사 컬럼 참조와 같은 방식으로 관심 행을 제한해요. classifier 함수는 인자로 union 변수를 쓸 때 특히 유용해요. 부분 집합의 어떤 변수가 실제로 일치했는지 결정하게 해줘요.
match_number 함수
MATCH_NUMBER()
match_number 함수는 파티션 안에서 일치의 순차 번호를 반환하며, 1부터 시작해요. 빈 일치도 비어 있지 않은 일치처럼 순차 번호가 할당돼요. 반환 타입은 bigint이에요.
논리적 내비게이션 함수
FIRST(A.totalprice, 2)
위 예시에서 first 함수는 패턴 변수 A에 일치한 첫 번째 행으로 이동한 다음, 일치 안에서 변수 A의 발생을 두 번 더 찾을 때까지 앞으로 검색해요. 결과는 그 행의 totalprice 컬럼 값이에요.
LAST(A.totalprice, 2)
위 예시에서 last 함수는 패턴 변수 A에 일치한 마지막 행으로 이동한 다음, 일치 안에서 변수 A의 발생을 두 번 더 찾을 때까지 뒤로 검색해요. 결과는 그 행의 totalprice 컬럼 값이에요.
first와 last 함수에서 검색된 행을 일치에서 찾지 못하면 결과는 null이에요.
두 번째 인자는 선택적이에요. 기본값은 0이며, 기본적으로 이 함수들이 관심의 첫 번째 또는 마지막 행으로 이동한다는 뜻이에요. 지정하면 두 번째 인자는 비음수 정수여야 해요.
물리적 내비게이션 함수
PREV(A.totalprice, 2)
위 예시에서 prev 함수는 패턴 변수 A에 일치한 마지막 행으로 이동한 다음 두 행 뒤로 검색해요. 결과는 그 행의 totalprice 컬럼 값이에요.
NEXT(A.totalprice, 2)
위 예시에서 next 함수는 패턴 변수 A에 일치한 마지막 행으로 이동한 다음 두 행 앞으로 검색해요. 결과는 그 행의 totalprice 컬럼 값이에요.
prev와 next 함수로 일치 밖으로 내비게이션하고 값을 검색하는 것이 가능해요. 내비게이션이 파티션 경계를 넘어가면 결과는 null이에요.
두 번째 인자는 선택적이에요. 기본값은 1이며, 기본적으로 이 함수들이 이전 또는 다음 행으로 이동한다는 뜻이에요. 지정하면 두 번째 인자는 비음수 정수여야 해요.
내비게이션 함수 중첩
논리적 내비게이션 함수를 물리적 내비게이션 함수 안에 중첩하는 것이 가능해요:
PREV(FIRST(A.totalprice, 3), 2)
중첩의 경우 먼저 논리적 내비게이션이 수행돼요. 그것이 물리적 내비게이션의 시작 행을 정해요. 두 내비게이션 연산이 모두 성공하면 지정된 행에서 값이 검색돼요.
패턴 내비게이션 함수는 첫 번째 인자 안에 최소 하나의 컬럼 참조나 classifier 함수를 요구해요. 다음 예시들은 올바르고:
LAST("pattern_variable_" || CLASSIFIER())
NEXT(U.totalprice + 10)
이것은 올바르지 않아요:
LAST(1)
또한 패턴 내비게이션 함수 안의 모든 컬럼 참조와 모든 classifier 호출이 참조된 패턴 변수에서 일관적이어야 해요. 그것들은 모두 같은 기본 변수, 같은 union 변수, 또는 암시적 보편 패턴 변수를 참조해야 해요. 다음 예시들은 올바르고:
LAST(CLASSIFIER() = 'A' OR totalprice > 10) /* universal pattern variable */
LAST(CLASSIFIER(U) = 'A' OR U.totalprice > 10) /* pattern variable U */
이것은 올바르지 않아요:
LAST(A.totalprice + B.totalprice)
집계 함수
행 패턴 인식 맥락에서 집계 함수를 사용하는 것이 허용돼요. 집계 함수는 현재 일치의 모든 행 또는 일치된 패턴 변수에 기반한 행 부분 집합에 대해 평가돼요. running과 final 의미가 지원되며, 기본값은 running이에요.
다음 표현식은 패턴 변수 A에 일치한 모든 행의 totalprice 컬럼 평균 값을 반환해요:
avg(A.totalprice)
다음 표현식은 부분 집합 U의 패턴 변수에 일치한 모든 행의 totalprice 컬럼 평균 값을 반환해요:
avg(U.totalprice)
다음 표현식은 일치의 모든 행의 totalprice 컬럼 평균 값을 반환해요:
avg(totalprice)
집계 인자
집계 함수에 인자가 여러 개면 모든 인자가 동일한 행 집합을 일관적으로 참조해야 해요:
max_by(totalprice, tax) /* 일치의 모든 행에 대해 집계 */
max_by(CLASSIFIER(A), A.tax) /* A에 일치한 모든 행에 대해 집계 */
이것은 올바르지 않아요:
max_by(A.totalprice, tax)
max_by(A.totalprice, A.tax + B.tax)
집계 인자가 어떤 컬럼 참조나 classifier 함수도 포함하지 않으면 어떤 패턴 변수도 참조하지 않아요. 그런 경우 다른 집계 인자가 집계할 행 집합을 결정해요. 인자 중 어떤 것도 패턴 변수 참조를 포함하지 않으면 보편 행 패턴 변수가 암시돼요. 이는 집계 함수가 일치의 모든 행에 적용된다는 뜻이에요:
count(1) /* 일치의 모든 행에 대해 집계 */
min_by(1, 2) /* 일치의 모든 행에 대해 집계 */
min_by(1, totalprice) /* 일치의 모든 행에 대해 집계 */
min_by(totalprice, 1) /* 일치의 모든 행에 대해 집계 */
min_by(A.totalprice, 1) /* A에 일치한 모든 행에 대해 집계 */
max_by(1, A.totalprice) /* A에 일치한 모든 행에 대해 집계 */
집계 함수 중첩
집계 함수 인자는 패턴 내비게이션 함수를 포함하면 안 돼요. 마찬가지로 집계 함수는 패턴 내비게이션 함수 안에 중첩될 수 없어요.
classifier와 match_number 함수 사용
집계 함수 인자에서 classifier와 match_number 함수를 사용하는 것이 허용돼요. 다음 표현식은 모든 일치된 패턴 변수를 포함하는 배열을 반환해요:
array_agg(CLASSIFIER())
이것은 ONE ROW PER MATCH 옵션과 결합할 때 특히 유용해요. 출력 크기를 줄이면서 일치의 모든 구성 요소를 얻을 수 있게 해줘요.
행 패턴 count 집계
행 패턴 인식 맥락의 다른 집계 함수처럼 count 함수는 일치의 모든 행 또는 특정 행 패턴 변수와 연관된 행에 적용할 수 있어요:
count(*), count() /* 일치의 모든 행을 센다 */
count(totalprice) /* 일치의 모든 행에서 totalprice 컬럼의
non-null 값을 센다 */
count(A.totalprice) /* A에 일치한 모든 행에서 totalprice 컬럼의
non-null 값을 센다 */
행 패턴 인식 맥락의 count 함수는 제한된 행 집합에 대한 count(*) 동작을 지원하는 특수 문법을 허용해요:
count(A.*) /* A에 일치한 행을 센다 */
count(U.*) /* 부분 집합 U의 패턴 변수에 일치한 행을 센다 */
RUNNING과 FINAL 의미
행 시퀀스의 패턴 매칭 중, 패턴에 맞는지 결정하기 위해 한 행씩 차례로 검사돼요. 어떤 단계에서도 부분 일치가 알려져 있지만, 앞으로 어떤 행이 추가될지 또는 어떤 패턴 변수에 매핑될지는 아직 알 수 없어요. 그래서 DEFINE 절의 현재 행에 대한 boolean 조건을 평가할 때 일치의 앞부분(현재 행 포함)만 "보인다". 이것이 running 의미예요.
MEASURES 절의 표현식을 평가할 때 일치는 완료되어 있어요. 그때 final 의미를 적용할 수 있어요. final 의미에서 전체 일치가 마지막 행의 위치에서 "보인다".
MEASURES 절에서 running 의미도 적용할 수 있어요. 행별로 정보를 출력할 때(ALL ROWS PER MATCH에서처럼) running 의미는 연속된 행의 위치에서 표현식을 평가해요.
running과 final 의미는 키워드 RUNNING과 FINAL로 표시되며, 논리적 내비게이션 함수 first나 last 또는 집계 함수 앞에 온다:
RUNNING LAST(A.totalprice)
FINAL LAST(A.totalprice)
RUNNING avg(A.totalprice)
FINAL count(A.*)
running 의미는 MEASURES와 DEFINE 절에서 기본이에요. FINAL은 MEASURES 절에서만 지정할 수 있어요.
ONE ROW PER MATCH 옵션에서 행 패턴 measure는 일치의 마지막 행 위치에서 평가돼요. 따라서 running과 final 의미가 같아요.
빈 일치와 일치하지 않는 행의 표현식 평가
빈 일치는 행 패턴이 성공적으로 일치했지만 패턴 변수가 할당되지 않았을 때 발생해요. 다음 패턴은 모든 행에 대해 빈 일치를 만들어요:
PATTERN(())
빈 일치에 대한 행 패턴 measure를 평가할 때:
- 모든 컬럼 참조는
null을 반환해요 - 모든 내비게이션 연산은
null을 반환해요 classifier함수는null을 반환해요match_number함수는 일치의 순차 번호를 반환해요- 모든 집계 함수는 빈 행 집합에 대해 평가돼요
모든 일치와 마찬가지로 빈 일치에도 시작 행이 있어요. measure와 함께 출력될 모든 입력 값(매치당 행 수에서 설명)은 시작 행의 값이에요.
일치하지 않는 행은 어떤 비어 있지 않은 일치에도 포함되지 않고 빈 일치의 시작 행도 아닌 행이에요. ALL ROWS PER MATCH WITH UNMATCHED ROWS 옵션에서 단일 출력 행이 생성돼요. 그 행에서 모든 행 패턴 measure는 null이에요. measure와 함께 출력될 모든 입력 값(매치당 행 수에서 설명)은 일치하지 않는 행의 값이에요. measure로 match_number 함수를 사용하면 빈 일치와 일치하지 않는 행을 구분하는 데 도움이 될 수 있어요.
더 알아보기 (Learn more)
MATCH_RECOGNIZE가 들어가는 쿼리 전체 구조는 SELECT 문서에서, 윈도우 구조에서의 유사한 패턴 인식은 sql-pattern-recognition-in-window 문서에서 다루고 있어요.