比较雪花中着陆区和暂存区的数据

问题描述

这是下面的要求,有两个表T1_D1T2_D2其中T1_D1 strong> 有 4 条记录T2_D26 条记录,其中有插入、更新

现在,我需要比较这两个表并更新表T1_D1上的所有修改

示例数据:T1_D1

ID TRANSACTION_DATE 产品 价格 IS_UPDATED
1 01/02/2009 13:08 Product1 350 N
2 01/02/2009 12:56 Product2 1300 N
3 01/02/2009 14:58 Product2 1250 N
4 01/02/2009 18:48 Product1 1450 N

示例数据:T1_D2

ID TRANSACTION_DATE 产品 价格
1 01/02/2009 13:08 Product1 350
3 01/02/2009 14:58 Product2 1250
4 01/02/2009 18:48 Product1 1450
5 01/02/2009 20:09 Product1 1200
6 01/02/2009 15:56 Product5 1300
3 01/02/2009 14:58 Product2 1350

最终结果:

ID TRANSACTION_DATE 产品 价格 IS_UPDATED
1 01/02/2009 13:08 Product1 350 N
2 01/02/2009 12:56 Product2 1300 N
3 01/02/2009 14:58 Product2 1250 Y
4 01/02/2009 18:48 Product1 1450 N
5 01/02/2009 20:09 Product1 1200 N
6 01/02/2009 15:56 Product5 1300 N
3 01/02/2009 14:58 Product2 1350 N

解决方法

建议的解决方案:

  1. 首先找到 T2_D2 - T1_D1 => 这给了我们增量,即插入和更新,并将它们附加到 t1_d1。 在这种情况下,附加在插入的意义上。

上述查询的实际结果集:

ID TRANSACTION_DATE 产品 价格
5 01/02/2009 20:09 Product1 1200
6 01/02/2009 15:56 Product5 1300
3 01/02/2009 14:58 Product2 1350
  1. 插入后的表格如下所示。
ID TRANSACTION_DATE 产品 价格 IS_UPDATED
1 01/02/2009 13:08 Product1 350 N
2 01/02/2009 12:56 Product2 1300 N
3 01/02/2009 14:58 Product2 1250 N
4 01/02/2009 18:48 Product1 1450 N
5 01/02/2009 20:09 Product1 1200 N
6 01/02/2009 15:56 Product5 1300 N
3 01/02/2009 14:58 Product2 1350 N
  1. 根据这个表,唯一值永远不会改变即 ID,PRODUCT 永远不会改变,而是所有其他值都会改变,所以我维护了一个名为 config_pull 的表具有以下架构。
ID TABLE_NAME COLS
1 T1_D1 ID,PRODUCT
  1. 现在我已经编写了一个过程,它获取config_pull 的结果集并动态地为上述要求生成一个查询。 即查询看起来像

SELECT T.ID,T.TRANSACTION_DATE,T.PRODUCT FROM T1_D1 as T,(SELECT ID,TRANSACTION_DATE,PRODUCT from T1_D2 EXCEPT SELECT ID,PRODUCT FROM T1_D1) as M WHERE M.ID = T.ID

  1. 上述查询给出了第 1 天的实际更新行。
ID TRANSACTION_DATE 产品 价格
3 01/02/2009 14:58 Product2 1250
  1. 稍后在 T1_D1 中编写一条更新语句来更新从上述查询中获取的所有行,即
ID TRANSACTION_DATE 产品 价格 IS_UPDATED
3 01/02/2009 14:58 Product2 1250 Y

最终结果

ID TRANSACTION_DATE 产品 价格 IS_UPDATED
1 01/02/2009 13:08 Product1 350 N
2 01/02/2009 12:56 Product2 1300 N
3 01/02/2009 14:58 Product2 1250 Y
4 01/02/2009 18:48 Product1 1450 N
5 01/02/2009 20:09 Product1 1200 N
6 01/02/2009 15:56 Product5 1300 N
3 01/02/2009 14:58 Product2 1350 N
  1. 现在,如果您想在 100 个表或 200 个表上运行此操作,首先将所有需要的关键列存储在一个表中并为其编写一个过程,以便在无需人工干预的情况下动态执行更新和所有操作。

如果您找到任何其他方法以不同的方式解决此问题,而不使用独特的列方法,请告诉我。

,

由于您使用的是 Snowflake,另一种方法是使用他们的“表流”方法来“更改数据捕获”。

Snowflake CDC

,

查看 MERGE 语句:

可以一步更新、插入、删除:

merge into target_table using source_table 
    on target_table.id = source_table.id
    when matched then 
        update set target_table.description = source_table.description
    when not matched then 
        insert (id,description) values (source_table.id,source_table.description);

看你的问题似乎是:

  • target_tableT1_D1
  • source_tableT2_D2
  • on target_table.id = source_table.idT1_D1.transaction_date=T2_D2.transaction_date and T1_D1.product=T2_D2.product
  • 更新会改变价格,将 target_table.description = source_table.description 更改为 T1_D1.price = T2_D2.price
  • 应更改插入以匹配 T1_D1 中的插入。