0

我错误地将重复文件加载到数据库表中(IBM DB2 v9.7)。我需要删除重复记录而不删除有效数据。

最初,我认为HAVING count(*) > 1可以解决我的问题,但这不起作用。我们的供应商生产具有修改规格的零件,因此一个文件可能会多次加载有效数据。

我知道几件事:

  1. 我的重复记录的日期范围:“2012-08-27”和“2012-09-02”之间
  2. 用于验证数据的属性

这是我识别骗子的 SQL 代码:

SELECT CAST(ENDDATE AS DATE) ENDDATE,CAST(LOADEDON AS DATE),SUBSTR(SITEID,1,20) SITEID,SUBSTR(LOCATIONNAME_1,1,20),SUBSTR(RID,1,15),COUNT(RID) FROM AUTOMATION WHERE CAST(ENDDATE AS DATE) BETWEEN '2012-08-27' AND '2012-09-02' GROUP BY CAST(ENDDATE AS DATE),CAST(LOADEDON AS DATE),SUBSTR(SITEID,1,20),SUBSTR(LOCATIONNAME_1,1,20),SUBSTR(RID,1,15) ORDER BY 5 ASC FOR FETCH ONLY WITH UR

编辑:可用于指定重复的列集是 RID、LOADEDON 和 FILENAME(此处未显示)。

这是一个示例输出

08/29/2012 09/05/2012 JGS Memphis          JGS Memphis          029369751671            518
09/01/2012 09/05/2012 Reynosa              Reynosa              029054883474            521
08/29/2012 09/05/2012 JGS Memphis          JGS Memphis          028881223425            522

我想删除时间范围“2012-08-27”和“2012-09-02”中的所有重复记录,而不删除出于合法原因加载 N 次的记录。

注意:该表没有主键(例如Rowid在 MS Sqlserver 中)

4

2 回答 2

2

我不太清楚哪一组列指定了重复项。以下假设它是示例输出中的列:

delete from (select t.*,
                    row_number() over (partition by enddate, loadedon, siteid order by loadedon desc) as seqnum
             from automation t
            ) t
where seqnum > 1

这使用 row_number() 来分配序列号并删除除第一行之外的所有行,保证一个留在数据库中。

于 2012-09-14T19:57:09.517 回答
1

除非你有办法区分与其他记录完全相同但良好的记录和与其他记录完全相同但不好的记录之间的区别,否则真的没有'没有办法做到这一点。还是我错过了问题中的某些内容?

于 2012-09-14T19:57:57.653 回答