2012-09-14 107 views
0

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

最初,我虽然HAVING count(*) > 1作为我的问题的解决方案,但这不会工作。我们的供应商生产具有修改规格的零件,因此可以通过有效数据多次加载文件。

我知道一些事情:

  1. 日期范围为我重复记录:属性之间“2012年8月27日”和 “2012-08-30”
  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 

ED IT:可用于指定重复的一组列可以是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年8月27日”的所有重复的记录“2012-08-30”,但不删除已加载n个记录次为合法原因。

注:表中没有主键(如Rowid在MS SQLSERVER,例如)

+0

难道你只是做一个回滚? – Kermit

+0

今天早上发现错误。它发生在上周。我太迟了。 – Chris

回答

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()来分配顺序号,并删除所有,但第一行,保证在数据库中一个停留。

+0

诀窍。谢谢。 – Chris

1

除非您有一些方法可以区分与某些其他记录记录完全相同但记录良好的记录和与其他记录完全相同但不太好的记录,真的没有办法做到这一点。或者我错过了这个问题中的某些东西?