【问题标题】:Comparing data on Landing zone with staging zone in snowflake比较雪花中着陆区与暂存区的数据
【发布时间】:2021-04-24 15:25:21
【问题描述】:

这里是如下要求,有两个表T1_D1T2_D2其中T1_D1 4 条记录T2_D26 条记录,其中有 Inserts、Updates

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

样本数据:T1_D1

ID TRANSACTION_DATE PRODUCT PRICE 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 PRODUCT PRICE
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 PRODUCT PRICE 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

【问题讨论】:

    标签: snowflake-cloud-data-platform querying delta


    【解决方案1】:

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

    Snowflake CDC

    【讨论】:

      【解决方案2】:

      查看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 中的插入。

      【讨论】:

      • 如果我使用合并方法,那么它会直接更新 T1_D1 中行的值,而不是我需要一个新行来更新更新的行。就像我在示例中演示的那样。
      【解决方案3】:

      建议的解决方案:

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

      上述查询的实际结果集:

      ID TRANSACTION_DATE PRODUCT PRICE
      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 PRODUCT PRICE 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,TRANSACTION_DATE,PRODUCT FROM T1_D1) as M WHERE M.ID = T.ID

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

      最终结果

      ID TRANSACTION_DATE PRODUCT PRICE 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 个表上运行此程序,请先将所需的所有关键列存储在一个表中并为其编写一个过程,以便在无需人工干预的情况下动态执行更新和所有操作。

      如果您发现任何其他方法可以不使用唯一列方法以其他方式解决此问题,请告诉我。

      【讨论】:

        猜你喜欢
        • 2022-07-10
        • 2020-09-06
        • 2023-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-12
        • 1970-01-01
        • 2020-04-06
        相关资源
        最近更新 更多