如果它们是重复行,如何用另一个表覆盖表行

Posted

技术标签:

【中文标题】如果它们是重复行,如何用另一个表覆盖表行【英文标题】: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 语句。 【参考方案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
     )
; 

【讨论】:

以上是关于如果它们是重复行,如何用另一个表覆盖表行的主要内容,如果未能解决你的问题,请参考以下文章

如何用新数据正确覆盖 SQLite 表行?

如何过滤 bigquery 的重复表行数据以删除重复行?

javascript - 检查表行是不是在视图中[重复]

如何用另一个div覆盖一个div作为覆盖[重复]

从 TypeScript 中的行 ID 获取表行索引 [重复]

如何使用 ng-repeat 重复的 J Query 将表行附加到表得到错误 $compile not found |Angular js