MATCH_RECOGNIZE 在 Snowflake 中使用 CTE
MATCH_RECOGNIZE with CTE in Snowflake
我在带有几个 CTE 的查询中使用 MATCH_RECOGNIZE
函数。当我 运行 查询时,出现以下错误:
SQL compilation error: MATCH_RECOGNIZE not supported in this context.
在我的查询中,MATCH_RECOGNIZE 前后有几个 CTE,部分如下。
WITH cte1 AS (
SELECT *
FROM dataset
WHERE ID IS NOT NULL AND STATUS IS NOT NULL ),
cte2 AS (
SELECT *
FROM cte1
QUALIFY FIRST_VALUE(STATUS) OVER (PARTITION BY ID ORDER BY CREATED_AT) = 'created' )
mr as (
SELECT *
FROM cte2
MATCH_RECOGNIZE (
PARTITION BY ID
ORDER BY CREATED_AT
MEASURES MATCH_NUMBER() AS mn,
MATCH_SEQUENCE_NUMBER AS msn
ALL ROWS PER MATCH
PATTERN (c+m+)
DEFINE
c AS status='created'
,m AS status='missing_info'
,p AS status='pending'
) m1
QUALIFY (ROW_NUMBER() OVER(PARTITION BY mn, ID ORDER BY msn) = 1)
OR(ROW_NUMBER() OVER(PARTITION BY mn, ID ORDER BY msn DESC)=1)
ORDER BY ID, CREATED_AT ),
cte3 as (
SELECT *
FROM mr
-- some other operations
)
解决这个问题的理想方法是什么?例如创建常规视图、物化视图或临时视图 table 等。我尝试创建视图但出现错误,也不确定是否支持。
如何在以后的其他 CTE 中使用 MATCH_RECOGNIZE
的结果?
当我添加以下内容时,出现此错误:
syntax error line xx at position 0 unexpected 'create'.
create view filtered_idents AS
SELECT *
FROM cte2
MATCH_RECOGNIZE (
)
这似乎是一个未记录在案的限制(我要求我们出色的文档团队解决此问题)。
与此同时,我建议将流程分成几个步骤以使用 match_recognize
结果。
重现错误:
with data as (
select company, price_date, price
from values('a',1,10), ('a',2,15)
), cte as (
select *
from data match_recognize(
partition by company
order by price_date
measures match_number() as "MATCH_NUMBER"
all rows per match omit empty matches
pattern(overavg*)
define
overavg as price > avg(price) over (rows between unbounded
preceding and unbounded following)
)
)
select * from cte
-- 002362 (0A000): SQL compilation error: MATCH_RECOGNIZE not supported in this context.
2 步解决方案:
with data as (
select company, price_date, price
from values('a',1,10), ('a',2,15)
)
select *
from data match_recognize(
partition by company
order by price_date
measures match_number() as "MATCH_NUMBER"
all rows per match omit empty matches
pattern(overavg*)
define
overavg as price > avg(price) over (rows between unbounded
preceding and unbounded following)
)
;
with previous_results as (
select *
from table(result_scan(last_query_id()))
)
select *
from previous_results
;
Kimi,尝试你的代码片段我得到:
SQL 编译错误:位置 0 处的语法错误行 11 意外 'mr'。位置 6 处的语法错误行 17 意外 'MEASURES'.
第 9 行似乎缺少一个终止逗号。
当我添加一个然后用一个简单的 select 语句完成整个过程时,我就不会再出现语法错误,我只会出现名称查找错误(当然是预期的)。
我在带有几个 CTE 的查询中使用 MATCH_RECOGNIZE
函数。当我 运行 查询时,出现以下错误:
SQL compilation error: MATCH_RECOGNIZE not supported in this context.
在我的查询中,MATCH_RECOGNIZE 前后有几个 CTE,部分如下。
WITH cte1 AS (
SELECT *
FROM dataset
WHERE ID IS NOT NULL AND STATUS IS NOT NULL ),
cte2 AS (
SELECT *
FROM cte1
QUALIFY FIRST_VALUE(STATUS) OVER (PARTITION BY ID ORDER BY CREATED_AT) = 'created' )
mr as (
SELECT *
FROM cte2
MATCH_RECOGNIZE (
PARTITION BY ID
ORDER BY CREATED_AT
MEASURES MATCH_NUMBER() AS mn,
MATCH_SEQUENCE_NUMBER AS msn
ALL ROWS PER MATCH
PATTERN (c+m+)
DEFINE
c AS status='created'
,m AS status='missing_info'
,p AS status='pending'
) m1
QUALIFY (ROW_NUMBER() OVER(PARTITION BY mn, ID ORDER BY msn) = 1)
OR(ROW_NUMBER() OVER(PARTITION BY mn, ID ORDER BY msn DESC)=1)
ORDER BY ID, CREATED_AT ),
cte3 as (
SELECT *
FROM mr
-- some other operations
)
解决这个问题的理想方法是什么?例如创建常规视图、物化视图或临时视图 table 等。我尝试创建视图但出现错误,也不确定是否支持。
如何在以后的其他 CTE 中使用 MATCH_RECOGNIZE
的结果?
当我添加以下内容时,出现此错误:
syntax error line xx at position 0 unexpected 'create'.
create view filtered_idents AS
SELECT *
FROM cte2
MATCH_RECOGNIZE (
)
这似乎是一个未记录在案的限制(我要求我们出色的文档团队解决此问题)。
与此同时,我建议将流程分成几个步骤以使用 match_recognize
结果。
重现错误:
with data as (
select company, price_date, price
from values('a',1,10), ('a',2,15)
), cte as (
select *
from data match_recognize(
partition by company
order by price_date
measures match_number() as "MATCH_NUMBER"
all rows per match omit empty matches
pattern(overavg*)
define
overavg as price > avg(price) over (rows between unbounded
preceding and unbounded following)
)
)
select * from cte
-- 002362 (0A000): SQL compilation error: MATCH_RECOGNIZE not supported in this context.
2 步解决方案:
with data as (
select company, price_date, price
from values('a',1,10), ('a',2,15)
)
select *
from data match_recognize(
partition by company
order by price_date
measures match_number() as "MATCH_NUMBER"
all rows per match omit empty matches
pattern(overavg*)
define
overavg as price > avg(price) over (rows between unbounded
preceding and unbounded following)
)
;
with previous_results as (
select *
from table(result_scan(last_query_id()))
)
select *
from previous_results
;
Kimi,尝试你的代码片段我得到:
SQL 编译错误:位置 0 处的语法错误行 11 意外 'mr'。位置 6 处的语法错误行 17 意外 'MEASURES'.
第 9 行似乎缺少一个终止逗号。 当我添加一个然后用一个简单的 select 语句完成整个过程时,我就不会再出现语法错误,我只会出现名称查找错误(当然是预期的)。