Snowflake cloud data platform 你在《雪花》中认识到的火柴并没有归还我认为应该归还的东西

Snowflake cloud data platform 你在《雪花》中认识到的火柴并没有归还我认为应该归还的东西,snowflake-cloud-data-platform,match-recognize,Snowflake Cloud Data Platform,Match Recognize,我肯定我不理解这一点,但这被定义为 模式:指定与模式()匹配的模式 模式定义表示匹配的有效行序列。这个 模式的定义类似于正则表达式(regex),它是从 符号、运算符和量词 例如: 例如,假设符号S1被定义为股价55。下面的模式 指定股票价格从中上涨的行序列 小于55到大于55: 模式(S1-S2) 所以如果我这样做了 create or replace table names (id int, name varchar (500), groupid int); insert into na

我肯定我不理解这一点,但这被定义为

模式:指定与模式()匹配的模式 模式定义表示匹配的有效行序列。这个 模式的定义类似于正则表达式(regex),它是从 符号、运算符和量词

例如:

例如,假设符号S1被定义为股价<55, 符号S2定义为股价>55。下面的模式 指定股票价格从中上涨的行序列 小于55到大于55:

模式(S1-S2)

所以如果我这样做了

create or replace table names (id int, name varchar (500), groupid int); 

insert into names
           select 1, 'andrew', 1
           union
           select 2, 'andrew2', 1
           union
           select 3, '3andrew', 1
然后我做了

select * from names
match_recognize(
partition by groupid order by id
measures
  classifier() as "classifier"
  all rows per match  
pattern (test test2)  
define test as startswith(name, 'and'),
  test2 as endswith(name, 'rew') 
 ) t
;        

我为什么不把“安德鲁”作为创纪录的回报呢?如果我在模式中放置任何一个测试,它都会显示出来。当我把两者都放进去的时候,它不会。相反,它显示了3andrew和andrew2作为记录结果,这对我来说是出乎意料的,因为这个例子让我相信它像and一样工作。非常感谢您的帮助。

所以您的模式
模式(test test2)
据我所知,就是说找到
test
通过的一行和
test2
通过的后一行

表示两条规则之间的运算符
(空格):

串联。指定符号或操作应跟随另一个符号或操作。例如,S1 S2意味着为S2定义的条件应发生在为S1定义的条件之后

但我怀疑您的问题是,为什么行id 1在
test
上不匹配,而行3在
test2
上不匹配。。我相信是
AFTER MATCH SKIP
默认设置为
pass LAST ROW
,它查找第1行和第2行匹配测试,因此它在最后一行之后开始,因此您只获得一个匹配。并不是说我可以用那个部分来关闭这个行为

如果我稍微更改输入数据:

WITH names(id, name, groupid) as (
    SELECT * FROM VALUES
        (10, 'andrew', 1),
        (20, '2andrew', 1),
        (30, 'andrew3', 1),
        (40, 'simeon', 1),
        (50, '4andrew', 1)
) 
这使得:

ID  NAME    GROUPID classifier
10  andrew  1   TEST
20  2andrew 1   TEST2
所以第10行可以工作,但在您的数据中,似乎2与3的绑定更接近,但在我的数据中,30与50不匹配。另外值得注意的是,在匹配中没有ORDERBY子句,这意味着您可能会得到不确定的结果。除非您已将数据重新排序到其他位置

因此,添加
分区
顺序
子句意味着andrews现在触发:

WITH names(id, name, groupid) as (
    SELECT * FROM VALUES
        (10, 'andrew', 1),
        (11, 'simeon', 2),
        (20, '2andrew', 1),
        (30, 'andrew3', 1),
        (60, 'simeon', 1),
        (50, '4andrew', 1)
)           
select * 
from names
match_recognize(
  partition by groupid 
  order by id
  measures
    classifier() as "classifier"
    all rows per match  

  pattern (test test2)  
  define test as startswith(name, 'and'),
    test2 as endswith(name, 'rew') 
 ) t
;   
模式是
(testtest2)
,这意味着查找恰好一行,该行以
开头,后跟一行后缀为
rew
图案窗口的大小为2。

行的处理如下所示:

1 andrew
2 andrew2
3 3andrew
通过1:

1 andrew
2 andrew2  -- fails it is not test2
通过2(此时跳过了第1行):

返回第2行和第3行,然后再次开始搜索过程(如果它们仍然是要处理的行)

若您想要任意数量的测试,那个么模式应该是
(test+test2)
-(窗口大小至少为2)

如果您希望元素是这两个元素之一,那么模式应该是
(test | test2)
-(窗口大小为1)



推荐阅读:

我将进行编辑以将其添加到中,在当前情况下,它不会更改输出,但是我担心我仍然会对匹配后的内容感到困惑,在我的原始示例(编辑后)中跳过默认值到过去的最后一行,例如“测试”:andrew matches,这是一个,它运行到下一个序列,是andrew2,返回andrew2。对于测试2:我不明白这是如何得到“3andrew”。。。我到底应该解释哪些步骤才能得到结果?
2 andrew2   -- test  pass
3 3andrew   -- test2 pass