Snowflake cloud data platform 使用在Snowflake中不起作用的子查询进行更新

Snowflake cloud data platform 使用在Snowflake中不起作用的子查询进行更新,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,(代表雪花用户提交) 我们在表中加载了错误的重复id,需要更正它。更新id的规则是,只要时差超过30分钟,id就应该是新的/唯一的。我已经编写了查询来过滤掉它,但是更新没有发生 下面的查询用于查找要更新的ID。对于测试,我使用了一个特定的id select id, BEFORE_TIME, TIMESTAMP, datediff(minute,BEFORE_TIME,TIMESTAMP) time_diff, row_number() over (PARTITION BY id ORD

(代表雪花用户提交)


我们在表中加载了错误的重复id,需要更正它。更新id的规则是,只要时差超过30分钟,id就应该是新的/唯一的。我已经编写了查询来过滤掉它,但是更新没有发生

下面的查询用于查找要更新的ID。对于测试,我使用了一个特定的id

select id,

BEFORE_TIME,

TIMESTAMP,

datediff(minute,BEFORE_TIME,TIMESTAMP) time_diff,

row_number() over (PARTITION BY id ORDER BY TIMESTAMP) rowno,

concat(id,to_varchar(rowno)) newid from

(SELECT id,

TIMESTAMP,

LAG(TIMESTAMP_EST) OVER (PARTITION BY visit_id ORDER BY TIMESTAMP) as BEFORE_TIME

FROM table_name t

where id = 'XX1X2375'

order by TIMESTAMP_EST)

where BEFORE_TIME is not NULL and time_diff > 30

order by time_diff desc

;
我可以看到12条记录,id相同,时差超过30。但是当我尝试更新时。查询已成功,但没有任何内容得到更新

update table_name t

set t.id = c.newid

from

(select id ,

BEFORE_TIME,

TIMESTAMP,

datediff(minute,BEFORE_TIME,TIMESTAMP) time_diff,

row_number() over (PARTITION BY id ORDER BY TIMESTAMP) rowno,

concat(id,to_varchar(rowno)) newid from

(SELECT id,

TIMESTAMP,

LAG(TIMESTAMP) OVER (PARTITION BY visit_id ORDER BY TIMESTAMP) as BEFORE_TIME

FROM table_name t

where id = 'XX1X2375'

order by TIMESTAMP_EST)

where BEFORE_TIME is not NULL and time_diff > 30

order by time_diff desc) c

where t.id = c.id

and t.timestamp = c.BEFORE_TIME

;
请注意:

我甚至从上面的子查询创建了一个临时表t1

我可以看到表t1中的记录

当使用join和主表执行select时,我甚至可以在主表的记录中看到

但是当我尝试使用新的t1更新时。它只是显示零记录更新

我甚至试过合并,但都是同一个问题

MERGE INTO snowplow_data_subset_temp t

USING t1

ON (trim(t.visit_id) = trim(t1.visit_id) and trim(t1.BEFORE_DATE) = trim(t.TIMESTAMP_EST))

WHEN MATCHED THEN UPDATE SET visit_number = newid;


有什么建议、想法或解决办法吗?谢谢

看起来他们可能遇到了两件事: 创建t1的表是临时表还是克隆表?查看

Get_DDL('t1','schemaname')

要检查在此会话中临时表上是否存在任何约束,请执行以下操作。也可以查询“表约束”视图 “或者,通过查询信息架构中的table_constraints视图,按架构(或数据库中的所有架构)检索所有表约束的列表。”来源:

由于子查询工作正常-merge和update语句是查找内容的线索,这是我在文档中找到的更多一般信息:

*子查询的限制:

您还可以通过更改会话来检查更新查询是否存在任何错误:

ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_UPDATE=TRUE

下面是一个如何对临时表使用更新的示例:

我期待着看到他们最终如何解决这个问题