MATCH 子句
允许您以搜索事件模式筛选大量历史数据的 SQL 扩展, MATCH 子句为解析分区、排序提供子类,并基于您定义的模式匹配结果表的行。
您指定一个由 DEFINE 子句中定义的事件类型组成的模式作为正则表达式,其中每个事件都与输入表中的一行对应。接下来,您可以在输入事件序列内搜索模式。模式匹配返回符合 PATTERN 子句的连续行序列。例如,模式 P
(A B* C
) 由三个事件类型组成:A、B 和 C,当 Vertica 在输入表中找到匹配时,相关模式实例必须是一个 A 类型事件,且后接零个或多个 B 类型事件和一个 C 类型事件。
如果您想在点击流分析中根据用户的 Web 浏览行为(页面点击)确定用户的操作,那么模式匹配就尤其有用。有关详细信息,请参阅事件系列模式匹配。
语法
MATCH ( [ PARTITION BY table‑column ] ORDER BY table‑column
DEFINE event‑name AS boolean‑expr [,...]
PATTERN pattern‑name AS ( regexp )
[ rows‑match‑clause ] )
参数
PARTITION BY
- 定义与 PATTERN 子句中定义的模式相匹配的窗口数据范围。分区子句通过 PATTERN 子句中定义的匹配模式将数据分区。使用 OEDER BY 子句对每个分区中的数据进行排序。如果忽略分区子句,则将整个数据集视为单个分区。
ORDER BY
- 定义与 PATTERN 子句中定义的模式相匹配的窗口数据范围。对于每个分区,顺序子句指定如何针对模式匹配对输入数据排序。
注意
ORDER BY 子句是强制性的。 DEFINE
- 定义在正则表达式中构成事件类型的 boolean 表达式。例如:
DEFINE Entry AS RefURL NOT ILIKE '%website2.com%' AND PageURL ILIKE '%website2.com%', Onsite AS PageURL ILIKE '%website2.com%' AND Action='V', Purchase AS PageURL ILIKE '%website2.com%' AND Action='P'
DEFINE 子句最多可接受 52 个事件。有关示例,请参阅 事件系列模式匹配。
- event‑name
- 每一行需要进行评估的事件名称,如前面示例中的
Entry, Onsite, Purchase
。注意
事件名称不区分大小写,且与表和列具有相同的命名约定。 - boolean‑expr
- 返回 true 或 false 的表达式。boolean_expr 可包含 布尔运算符 和相关 (comparison) 运算符。例如:
Purchase AS PageURL ILIKE '%website2.com%' AND Action = 'P'
-
PATTERN pattern‑name
- 在 PATTERN 子句中定义的模式的名称,例如,P 是如下文定义的模式名称:
PATTERN P AS (...)
PATTERN 是由名称和正则表达式组成的搜索模式。
注意
Vertica 支持每次查询一个模式。 - regexp
- 一个正则表达式,由
DEFINE
子句中定义的事件类型和下面的一个或多个限定符组成。当 Vertica 评估MATCH
子句时,正则表达式会识别满足表达式条件的行。 - rows‑match‑clause
- 指定如何解决单一行中评估为真的事件多于一个的问题,为以下几项之一:
-
ROWS MATCH ALL EVENTS
:如果单一行中的多个事件评估为真,Vertica 将返回以下错误:ERROR: pattern events must be mutually exclusive HINT: try using ROWS MATCH FIRST EVENT
-
ROWS MATCH FIRST EVENT
:如果给定行中的多个事件评估为真,Vertica 将使用该行的 SQL 语句中的第一个事件。
-
模式语意评估
-
SQL 子句的语意评估顺序是:FROM -> WHERE -> PATTERN MATCH -> SELECT。
-
数据根据 PARTITION BY 子句的规定分区。如果忽略分区子句,则将整个数据集视为单个分区。
-
对于每个分区,顺序子句指定如何针对模式匹配对输入数据排序。
-
对每一行的事件进行评估。一行可以具有 0、1 或 N 个事件评估为真。如果同一行中评估为真的事件超过一个,除非您指定 ROWS MATCH FIRST EVENT,否则 Vertica 将返回一个运行时错误。如果指定了 ROWS MATCH FIRST EVENT,且单一行中评估为真的事件多于一个,Vertica 将选择 SQL 语句中第一个定义的事件用于行。
-
Vertica 通过查找符合 PATTERN 子句中定义模式的连续行序列执行模式匹配。
对于每一个匹配,Vertica 将输出匹配行。并非匹配一部分的行(不满足一个或多个术语)不输出。
-
Vertica 仅报告非重叠匹配。如果发生重叠,Vertica 将选择输入流中发现的第一个匹配。查找到匹配后,Vertica 会在前一次匹配结束后,开始搜索下一个匹配。
-
Vertica 将报告最长可能匹配,而不是匹配的子集。例如,考虑模式:AB(包含输入):AAAB。因为 A 使用贪婪正则表达式量词 (),所以 Vertica 会报告所有 A 的输入 (AAAB),而不是 AAB、AB 或 B。
注释和限制
-
模式匹配查询中不允许使用 DISTINCT 和 GROUP BY/HAVING 子句。
-
下面的表达式不可用于 DEFINE 子句:
-
子查询,如
DEFINE X AS c IN ELECT c FROM table
-
分析函数,如
DEFINE X AS c <EA1) OVER (ORDER BY 1)
-
聚合函数,如
DEFINE X AS c <A1)
-
-
不可使用相同的模式名称定义不同的事件,例如,X 不允许执行下文:
DEFINE X AS c1 < 3 X AS c1 >= 3
-
与 MATCH 子句一起使用,Vertica MATCH 子句函数 提供关于模式的额外数据。例如,您可是使用函数返回表示与输入行相匹配的事件名称、匹配的序列号或匹配模式实例的分区范围内唯一标识符。
示例
例如,请参阅事件系列模式匹配。