2012-09-14 166 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

除非您有一些方法可以區分與某些其他記錄記錄完全相同但記錄良好的記錄和與其他記錄完全相同但不太好的記錄,真的沒有辦法做到這一點。或者我錯過了這個問題中的某些東西?