使用无法在Snowflake中运行的子查询进行更新

时间:2019-10-14 21:07:33

标签: snowflake-data-warehouse

(代表雪花用户提交)


我们在表中加载了错误的重复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

;

我可以看到具有相同ID和时差的12条记录超过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中看到记录。

当选择与主表的联接时,我什至可以在主表的记录中看到。

但是当我尝试使用新的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;

有什么建议,想法或解决方法吗?谢谢!

1 个答案:

答案 0 :(得分:0)

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

  

Get_DDL('t1','schemaname');

检查您接下来要处理的会话中的临时表是否有任何约束。或者您可以查询表约束视图 “或者,通过查询信息模式中的TABLE_CONSTRAINTS视图视图,按模式(或跨数据库中的所有模式)检索所有表约束的列表。”来自:https://docs.snowflake.net/manuals/user-guide/table-considerations.html#referential-integrity-constraints

由于子查询运行正常-合并和更新语句是寻找内容的线索,这就是我在文档中找到的更常规信息:

*子查询的限制: https://docs.snowflake.net/manuals/user-guide/querying-subqueries.html#limitations

您还可以通过更改会话来检查更新查询是否存在任何错误:https://docs.snowflake.net/manuals/sql-reference/sql/update.html#usage-notes

  

ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_UPDATE = TRUE;

以下是如何对Temp表使用更新的示例: https://snowflakecommunity.force.com/s/question/0D50Z00008P7BznSAF/can-you-use-a-cte-or-temp-table-with-an-update-statement-to-update-a-table

我期待看到他们最终如何解决问题。