You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATCH_RECOGNIZE函数PATTERN使用+量词结果差异原因咨询

MATCH_RECOGNIZE两种模式执行逻辑差异说明

两个查询的差异本质是MATCH_RECOGNIZE中模式量词规则和MEASURES默认取值规则共同作用的结果:

1. 模式PATTERN (same_dept)的执行逻辑

无任何量词的模式代表匹配长度为1的独立行序列,逐行判断规则:

  • same_dept的定义为FIRST(dept_id) = dept_id,当序列长度为1时,FIRST(dept_id)就是当前行自身的部门ID,所有行都满足匹配条件,因此返回全部12条原始记录。

2. 模式PATTERN (same_dept+)的执行逻辑

+是正则匹配中的量词,代表匹配长度≥1的连续符合规则的行序列,且默认采用贪婪匹配策略,会尽可能把连续满足规则的行合并为一个匹配组:

  • 你的原始数据按dept_id连续分组,刚好可以分为4个连续同部门的行组:
    • 组1:前3行,dept_id=5652
    • 组2:接下来2行,dept_id=5647
    • 组3:接下来4行,dept_id=5649
    • 组4:最后3行,dept_id=5652
  • 你的MEASURES子句没有指定取序列内的哪一行字段值,默认会取每个匹配组的最后一行的对应字段,因此最终返回4条记录,刚好对应4个同部门组的最后一行数据。

扩展说明

如果你的需求是合并连续同部门的任职记录,得到每个任职阶段的完整起止时间,可以修改MEASURES子句明确取值位置:

SELECT *
FROM   empdepthist
MATCH_RECOGNIZE (
  PARTITION BY login_name
  ORDER BY startdate
  MEASURES
    FIRST(emp_name) AS emp_name,
    FIRST(dept_id) AS dept_id,
    FIRST(dept_name) AS dept_name,
    FIRST(startDate) AS tenure_start,
    LAST(endDate) AS tenure_end 
  PATTERN (same_dept+)
  DEFINE same_dept AS FIRST(dept_id) = dept_id
)

这样就可以得到4条完整的任职周期记录,每条对应一次完整的部门任职时间段。

内容的提问来源于stack exchange,提问作者Kate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 14:45:03