【问题标题】:How to overwrite the table rows by another Table if they are duplicate rows如果它们是重复行,如何用另一个表覆盖表行
【发布时间】:2021-04-11 13:13:00
【问题描述】:

我有一张雪花表,上面有一些数据,如下所示

表1(雪花表)

LOCATIONID  OBSERVATION_TIME_UTC    source_record_id                                            Value
LFOB        201001000001.00         cw_altdata:LFOB_historical_hourly.txt:2020-12-23_003400:1   3
LFOB        201001000002.00         cw_altdata:LFOB_historical_hourly.txt:2020-12-23_003400:2   3

对于现有表,我需要附加数据并根据前 2 列删除重复项

表2(需要追加到已有表)

LOCATIONID  OBSERVATION_TIME_UTC    source_record_id                                            Value
LFOB        201001000001.00         cw_altdata:LFOB_historical_hourly.txt:2020-12-24_003400:3   4
LFOB        201001000002.00         cw_altdata:LFOB_historical_hourly.txt:2020-12-24_003400:4   4

在附加表 2 数据之后。我希望从表中删除重复的数据。我的输出表应该是这样的。

LOCATIONID  OBSERVATION_TIME_UTC    source_record_id                                            Value
LFOB        201001000001.00         cw_altdata:LFOB_historical_hourly.txt:2020-12-24_003400:3   4
LFOB        201001000002.00         cw_altdata:LFOB_historical_hourly.txt:2020-12-24_003400:4   4

在这里我们可以看到重复的行已被删除。它应该保持最新的日期。例如:这里 2020-12-24_003400 是上表 1 的最新日期。

我只知道一些sql语句的基础知识。我没有找到任何有关此的文章,因此没有机会尝试任何解决方案。如果有人有解决方案,那将是一个很大的帮助。

【问题讨论】:

  • 研究使用 upsert 语句。

标签: snowflake-cloud-data-platform


【解决方案1】:

UPDATE 是 Snowflake(以及几乎所有其他 RDBMS)中最昂贵的 DML。如果表 2 中的行数占表 1 的很大百分比,并且很大百分比将导致 UPDATE 而不是 INSERT,则可以使用以下技术:

从表_1 T1 中删除(T1.LOCATIONID,T1.OBSERVATION_TIME_UTC) IN (SELECT T2.LOCATIONID, T2.OBSERVATION_TIME_UTC FROM TABLE_2 T2);

插入 TABLE_1(从 TABLE_2 中选择 *);

【讨论】:

    【解决方案2】:

    如果您想消除表中所有列中重复的行(并假设 Table_1 中没有重复:

    插入表_1 (从 TABLE_2 中选择 * 减 从表_1中选择*)

    或者,如果表有很多列:

    插入表_1 (从 TABLE_2 T2 中选择 * 地点(T2.LOCATIONID,T2.OBSERVATION_TIME_UTC) 不在 ( 选择 LOCATIONID,OBSERVATION_TIME_UTC 从表_T2 减 选择 LOCATIONID,OBSERVATION_TIME_UTC FROM TABLE_T1)

    【讨论】:

    • 嗨@jefferyJacobs,第二个查询对我不起作用。它给出了以下错误 SQL 编译错误:位置 313 的语法错误第 1 行意外''。你知道这个错误是什么意思吗
    • 在它工作的最后添加了右括号。谢谢
    • 查询没有给出任何结果。它将重复数据附加到 Table_1;)
    • 抱歉,我误解了你的意图。您想根据前 2 列更新现有行,我假设从表 2 中添加新行。这与您的问题语句不同。您不是“追加和删除重复项”。按照建议,看看使用 MERGE。
    【解决方案3】:

    当业务键的值不同时,您可以使用合并语句将 table_1 更新为 table_2 中的值(假设在这种情况下业务键是 LOCATIONID、OBSERVATION_TIME_UTC)。如果 table_1 中不存在业务键,则合并语句将插入行。

    这是合并:

    merge into table_1
    using(SELECT LOCATIONID,  
                 OBSERVATION_TIME_UTC,    
                 source_record_id,                                            
                 Value
          FROM table_2
         ) table_2
         on table_1.LOCATIONID = table_2.LOCATIONID
         and table_1.OBSERVATION_TIME_UTC = table_2.OBSERVATION_TIME_UTC
    WHEN MATCHED
    and  table_1.source_record_id is distinct from table_2.source_record_id or
         table_1.value            is distinct from table_2.value
    THEN UPDATE
    SET  table_1.source_record_id = table_2.source_record_id,
         table_1.value            = table_2.value
    WHEN NOT MATCHED
    THEN INSERT
         (
          LOCATIONID,  
          OBSERVATION_TIME_UTC,    
          source_record_id,                                            
          Value
         )
    VALUES
         (
          table_2.LOCATIONID,  
          table_2.OBSERVATION_TIME_UTC,    
          table_2.source_record_id,                                            
          table_2.Value
         )
    ; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      相关资源
      最近更新 更多