如何用Trino的MATCH_RECOGNIZE获取所有ABC匹配结果?
解决方案
方法一:使用关联查询直接获取所有匹配
你的需求是找出所有满足A.id < B.id < C.id的三元组(其中C为id=6的唯一记录),用普通JOIN查询更直接,能准确得到所有期望结果:
SELECT a.id AS a_id, a.value AS a_val, b.id AS b_id, b.value AS b_val, c.id AS c_id, c.value AS c_val FROM abc a JOIN abc b ON a.id < b.id JOIN abc c ON b.id < c.id WHERE a.value = 'A' AND b.value = 'B' AND c.value = 'C';
执行后会返回你需要的3条结果:
a_id | a_val | b_id | b_val | c_id | c_val -----+-------+------+-------+------+------- 1 | A | 2 | B | 6 | C 1 | A | 4 | B | 6 | C 3 | A | 4 | B | 6 | C
原有MATCH_RECOGNIZE查询的问题分析
你尝试的两种跳过策略都无法满足需求:
after match skip to next row:每次匹配后跳到下一行,后续扫描无法回溯匹配之前的A记录(比如匹配完1A-2B-6C后,从id3开始扫描,无法再关联id1的A和id4的B)。after match skip to first A:会触发无限循环,因为扫描到C后又跳回前面的A,重复处理同一批数据。
Trino的MATCH_RECOGNIZE更适合处理连续或半连续的模式匹配(按顺序出现的序列,不要求回溯匹配之前的记录),对于这种需要枚举所有跨位置组合的场景,关联查询是更高效且直观的选择。
内容的提问来源于stack exchange,提问作者user22614632
相关产品推荐
相关产品推荐

