【问题标题】:Removing duplicate records using another table's oid使用另一个表的 oid 删除重复记录
【发布时间】:2015-12-03 14:25:57
【问题描述】:
Table 1          Table 2
--------         --------
oid              oid (J)
sequence         trip_id
stop             
trip_update_id (J)

(J) = join

Table 1Table 2 每 30 秒同时从一个 api 更新一次。

在每天结束时,Table 1 填充了 98% 的重复数据,这是因为数据馈送既包括过去 30 秒内生成的新数据,也包括同一天之前馈送中生成的所有数据。结果Table 1 填充了大部分重复数据(在插入时会自动生成 oid,因此所有 oid 都是唯一的)。

Table 2 具有所有唯一记录,因此我的问题是将Table 1 转换为Table 2 中每个trip_id 的所有唯一记录的sql 是什么。

【问题讨论】:

  • 从表中删除重复(去重)记录的方法有很多种,每种方法各有优缺点。使用相关子查询 使用临时表 创建具有不同记录的新表并重命名它.. 使用公用表表达式 (CTE) 在 SSIS 中使用模糊组转换 使用 MERGE 语句
  • 我会改为增强从 API 获取数据的插入脚本,以确保它在插入之前检查数据。插入脚本将使用 MERGE 或其他 UPSERT 方法。
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?
  • Fora table1 trip_update_id 值,保留哪一行?最低/最高 oid?
  • 那么,如果 oid 是唯一的,但在 Table_1 和 Table_2 之间共享(用于连接)值,并且 Table_2 没有重复项,为什么不只是“DELETE FROM Table_1 WHERE oid NOT IN (SELECT oid FROM Table_2)”?

标签: sql database postgresql duplicate-removal


【解决方案1】:

我不太确定我是否理解问题所在,但这里有一些建议。

要从 table1 中删除 table2 中未找到 trip_update_id 值的行:

delete from table1
    where trip_update_id not in (select trip_id from table2 where trip_id is not null)

(如果trip_id 允许有NULL 值,is not null 部分非常重要!!!)

要复制表 1 中的 remove_trip_update_id 行,保留 oid 最高的行:

delete from table1
   where oid not in (select max(oid) from table1
                     group by trip_update_id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多