【发布时间】:2020-09-24 06:32:08
【问题描述】:
我使用的是没有分区机制的雪花表,而是有微分区。 我们有一个新的要求,即在桌子上执行不同类型的满载。
场景: 我有一个包含三列的表:ID、名称、Current_Location 第一天的记录:
Se Name Current_Location Rate
1 A L1 100
2 B L2 200
3 C L3 300
4 D L4 400
5 E L5 500
6 F L6 600
7 G L7 700
8 H L7 800
我的要求是我每天以不同的速率为每个 Current_Location 获取新数据,即
第2天:
Se Name Current_Location Rate
6 P L6 6000
7 G L7 7000
8 H L7 1100
9 Z L7 1200
根据列中的值:Current_Location,我先截断了以前的记录,然后加载新记录。例如,使用 Current_Location L7 在上述场景中,第 1 天的 L7 有两条记录,但在第 2 天,我得到了 3 条记录。
所以我必须截断
7 G L7 700
8 H L7 800
然后将 Day2 中的所有三个新记录加载到我的表中。 L6也是如此。截断和加载后的最终表应如下所示:
Se Name Current_Location Rate
1 A L1 100
2 B L2 200
3 C L3 300
4 D L4 400
5 E L5 500
6 P L6 6000
7 G L7 7000
8 H L7 1100
9 Z L7 1200
为了实现这一点,我想到了实现:
- 将所有新数据插入到 target_table 中。此时,target_table 也包含新旧记录。
- 然后通过选择 max(Current_Location) 在其上创建一个视图并将其公开给用户。
create or replace view final_view as select * from target_table where Current_Location = (select max(Current_Location) from target_table)
但是我必须稍后用旧的 Current_Location 截断旧记录,一旦我删除它们,我的表和视图就会变得相同。 我正在使用 Snowflake 数据库,尽管有微分区,但其中没有分区的概念。 有没有什么有效的方法来做同样的操作?
Edit1:我探索了合并查询:
MERGE INTO t1 USING t2 ON t1.t1Key = t2.t2Key
WHEN MATCHED AND t2.marked = 1 THEN DELETE
WHEN MATCHED AND t2.isNewStatus = 1 THEN UPDATE SET val = t2.newVal, status = t2.newStatus
WHEN MATCHED THEN UPDATE SET val = t2.newVal
WHEN NOT MATCHED THEN INSERT (val, status) VALUES (t2.newVal, t2.newStatus);
一旦一个案例被执行,是否也会检查下一个案例?
例如:一行匹配 DELETE 条件,它被删除。现在我必须将具有相同键的行插入表中。 WHEN NOT MACTHED 的案子也会被执行吗?或者一旦一个case被执行,控件就退出MERGE Query?
【问题讨论】:
-
我认为您需要在此处提供更多信息。此外,这看起来像是您已经问过的重复问题?这里:stackoverflow.com/questions/64044360/…
-
是的,我有更多关于这个问题的信息,因为我有办法做到这一点(我还在那个问题中发布了我的做法)。我正在编辑它,但在将我的更改从记事本添加到浏览器之前错误地保存了它。就在不久前为主持人干预提出了一个标志。所以我在那里发布了这个问题。
标签: sql snowflake-cloud-data-platform