2009-07-23 23 views
10

いくつかの行を含むテーブルがあります。すべての行には日付フィールドがあります。今、それは日付の重複かもしれません。私はすべての重複を削除し、最高の行を格納する必要がありますid。これはSQLクエリを使用してどのように可能ですか?SQLを使用して重複行を削除するにはどうすればよいですか?

今:

date  id 
'07/07' 1 
'07/07' 2 
'07/07' 3 
'07/05' 4 
'07/05' 5 

私が欲しいもの:mysqlのはPostgreSQL、Oracleのより良い方法については

date  id 
'07/07' 3 
'07/05' 5 
+0

送信したデータから、3行ではなく2行になります。 07/05が繰り返されます。 – notnoop

答えて

33
DELETE FROM table WHERE id NOT IN 
    (SELECT MAX(id) FROM table GROUP BY date); 
+0

うわー、私はラウンドアバウトの道をやったのですか?これは間違いなくこれを行うための最善の方法です。 – Eric

+0

私はあなたのやり方がちょっと複雑すぎると思っていました...しかし正直なところ、私は最初に3つのクエリを使っていました。 –

+4

このクエリはまた、この答えに便利です:日付HAVING BYテーブル グループからNumOccurrences AS SELECT日付、 COUNT(日)(COUNT(日)> 1) – djangofan

2

SELF JOINのです。

Postgresql: 
DELETE FROM table t1 USING table t2 WHERE t1.date=t2.date AND t1.id<t2.id; 

MySQL   
DELETE FROM table 
USING table, table as vtable 
WHERE (table.id < vtable.id) 
AND (table.date=vtable.date) 

SQL集計(max、group by)関数は、ほとんど常に非常に遅いです。

6

私はコメントの権限を持っていない、誰もが同じ問題に遭遇した場合にはので、ここでの答えとしての私のコメントです、:SQLite3のでは

、そこに「ROWID」と呼ばれる暗黙の数値の主キーであるため、同じクエリは次のようになります:

DELETE FROM table WHERE rowid NOT IN 
(SELECT MAX(rowid) FROM table GROUP BY date); 

"id"というプライマリキー列が含まれていなくても、これはどのテーブルでも機能します。

関連する問題