2016-05-12 44 views
0

想象我有這樣的表:刪除兩排,其中第一列是相同的一個和第二不同的日期

Nr   Date 

2162416  14.02.2014 
2162416  11.08.2006 
2672007  13.04.2016 
2672007  27.11.2007 
3030211  31.01.2013 
3030211  25.04.2006 
3108243  11.04.2016 
3108243  24.08.2009 
3209248  05.04.2016 
3209248  08.06.2012 
3232333  11.04.2012 
3232333  23.12.2011 
3232440  08.04.2013 
3232440  23.01.2008 

,你可以看到,這些條目是對僅關於日期列的值不同。我如何通過比較日期來刪除其中的一個。我想刪除舊的。

有可與相同上午十時正

+0

如果有3行與同NR,你要保留1個或2行? – jarlh

+0

只能有兩行具有相同的Nr。 – Eritrean

回答

3

簡單的辦法,用EXISTS刪除行如果用同樣的上午十時正,但以後的日子另一行存在:

delete from tablename t1 
where exists (select 1 from tablename t2 
       where t2.nr = t1.nr 
       and t2.date > t1.date) 

或者:

delete from tablename 
where (nr, date) not in (select nr, max(date) from tablename group by nr) 
+0

非常感謝。這解決了我的問題。 – Eritrean

2

只有兩排。如果你總是對的行,你可以使用:

delete your_table 
where (nr, date) in (
        select nr, min(date) 
        from your_table 
        group by nr 
        ) 

如果你想處理中,你只有一個行的情況下,你可以添加一個條件:

delete your_table 
where (nr, date) in (
        select nr, min(date) 
        from your_table 
        group by nr 
        having count(1) > 1 
        ) 
+1

將刪除所有「單」nr行! – jarlh

+0

或者反轉並刪除那些不在... MAX(日期)... –

+0

@jarlh:你說得對,我只是編輯處理單行 – Aleksej

1

使用公用表表達式(CTE)的一種方法:

DELETE FROM your_table 
WHERE (nr, date) IN 
(
    WITH x AS 
    (
     SELECT nr, date, 
     ROW_NUMBER() OVER (PARTITION BY nr ORDER BY date DESC) AS n 
     FROM your_table 
    ) 
    SELECT nr, date 
    FROM x 
    WHERE n > 2 
); 
相關問題