删除 ODI 中 I$ 表中的重复项

Posted

技术标签:

【中文标题】删除 ODI 中 I$ 表中的重复项【英文标题】:Delete Duplicate in I$ table in ODI 【发布时间】:2021-12-30 00:17:31 【问题描述】:

我们在 ODI 中有一个加载计划。由于 I% 表中的重复记录,我们在某些场景中会出现重复错误。我们所做的是每次加载计划失败时手动运行脚本。

DELETE FROM adw12_dw. I$_1558911580_4
      WHERE     (EFFECTIVE_FROM_DT, DATASOURCE_NUM_ID, INTEGRATION_ID) IN
                    (  SELECT EFFECTIVE_FROM_DT,
                              DATASOURCE_NUM_ID,
                              INTEGRATION_ID
                         FROM adw12_dw . I$_1558911580_4
                     GROUP BY EFFECTIVE_FROM_DT,
                              DATASOURCE_NUM_ID,
                              INTEGRATION_ID
                       HAVING COUNT (1) > 1)
            AND ROWID NOT IN
                    (  SELECT MIN (ROWID)
                         FROM adw12_dw . I$_1558911580_4
                     GROUP BY EFFECTIVE_FROM_DT,
                              DATASOURCE_NUM_ID,
                              INTEGRATION_ID
                       HAVING COUNT (1) > 1)
                
                commit;

有没有办法自动删除集成表中的重复记录?

【问题讨论】:

不看映射很难判断。这些重复来自我猜的来源?映射逻辑是什么?使用的 IKM 是什么,加载策略是什么? 【参考方案1】:

如果源中有重复项,最好在映射逻辑中处理。 可行的方法是添加一个表达式组件来添加一个row_rank 列,使用分析函数对重复项进行排名:row_number() over (partition by EFFECTIVE_FROM_DT, DATASOURCE_NUM_ID, INTEGRATION_ID order by ROWID)。 然后,您可以添加条件为row_rank = 1 的过滤器。

如果您希望在插入后进行删除,您可以编辑 IKM 并在加载目标表之前添加删除步骤。

您还可以将集成分为 3 个不同的步骤:

    一个映射会加载一个临时表而不是您的最终目标表,并带有重复项 一个 ODI 过程,将执行删除以删除临时表中的重复项 将数据从暂存区加载到目标表的映射

【讨论】:

非常感谢@JeromeFR,非常感谢!【参考方案2】:

也许您的重复计数超过 2,因为我们必须递归执行删除查询。例如:

CREATE OR REPLACE PROCEDURE delete_dublicates
IS
BEGIN
    DELETE FROM TABLE1 WHERE ID IN 
        (
            SELECT max(ID) FROM TABLE1
            GROUP BY USER_ID, TYPE_ID 
            HAVING count(*) > 1
        );

    IF (SQL%ROWCOUNT > 0) THEN 
        delete_dublicates;
    END IF; 

END delete_dublicates;

【讨论】:

以上是关于删除 ODI 中 I$ 表中的重复项的主要内容,如果未能解决你的问题,请参考以下文章

从 mongodb 数组中的所有重复项中拉出一个元素

odi增量更新策略

#yyds干货盘点# 面试必刷TOP101:删除有序链表中重复的元素-I

excel怎么样自动选择重复项中的唯一值

如何获取mysql重复项中的最后一条数据

使用正则表达式从python中的列表项中删除子字符串