2012-02-03 54 views
1

我們有一個場景,我們需要從表中刪除基於時間戳的所有重複行。表結構如下所示:PL/SQl,oracle 9i,使用sql刪除重複行

 
Item Ref1 Ref2  Timestamp 
1  A  test1  2/3/2012 10:00:00 
1  A  test2  2/3/2012 11:00:00 
1  A  test1  2/3/2012 12:00:00 
2  A  prod1  2/3/2012 10:00:00 
2  B  prod2  2/3/2012 11:00:00 
2  A  prod2  2/3/2012 12:00:00 

所以我們需要根據item和ref1從這個表中刪除重複的行。像這裏,我們應該只有1行的項目1和ref1 A與最新的時間戳。與第2項相同,我們應該只有1行具有最新時間戳的ref1 A.

任何指針將是巨大的

回答

3

假設你所需的最終結果是與這些3行

Item Ref1 Ref2  Timestamp 
1  A  test1  2/3/2012 12:00:00 
2  B  prod2  2/3/2012 11:00:00 
2  A  prod2  2/3/2012 12:00:00 

喜歡的東西

DELETE FROM table_name a 
WHERE EXISTS(SELECT 1 
       FROM table_name b 
       WHERE a.item = b.item 
        AND a.ref1 = b.ref1 
        AND a.timestamp < b.timestamp); 
表視圖刪除記錄

應該工作,假設沒有兩行具有相同的ItemRef1,它們都有相同的Timestamp。如果可以用相同的ItemRef1既擁有最新Timestamp並假設你不關心你把哪一個

DELETE FROM table_name a 
WHERE EXISTS(SELECT 1 
       FROM table_name b 
       WHERE a.item = b.item 
        AND a.ref1 = b.ref1 
        AND a.timestamp <= b.timestamp 
        AND a.rowid  < b.rowid); 
+0

謝謝!正是我需要的 – sandy 2012-02-03 18:31:47

1

您可以查詢您的記錄由項目分組和Ref1至一個然後刪除其中項目和參考是平等的和時間戳<最大。

select Item 
    , Ref1 
    , max(Timestamp) tm 
    from table 
group by Item, Ref1 

的結果吧...

delete from table where Item = ? and Ref1 = ? and Timestamp < ? 
+0

感謝它指出我在正確的大方向多行! – sandy 2012-02-03 18:31:08

0

我沒有一個Oracle 9安裝在手,所以我不能對此進行測試,但我認爲,這可能工作:

  1. 創建其中列出了一個視圖增加 「指數」,以您的記錄:

    SELECT ROW_NUMBER() OVER (PARTITION BY Item, Ref1 ORDER BY Timestamp DESC) ix, * FROM table

  2. 從那裏ix高於1