Snowflake cloud data platform 你在《雪花》中认识到的火柴并没有归还我认为应该归还的东西
我肯定我不理解这一点,但这被定义为 模式:指定与模式()匹配的模式 模式定义表示匹配的有效行序列。这个 模式的定义类似于正则表达式(regex),它是从 符号、运算符和量词 例如: 例如,假设符号S1被定义为股价<55, 符号S2定义为股价>55。下面的模式 指定股票价格从中上涨的行序列 小于55到大于55: 模式(S1-S2) 所以如果我这样做了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
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