web-dev-qa-db-ja.com

SQLiteで重複を削除するにはどうすればよいですか?

私はSQLiteDBを持っています。

SELECT messdatum, count(*) as anzahl 
from lipo 
GROUP BY Messdatum 
ORDER BY anzahl desc;

結果はいくつかの行になります。これは、同じMessdatumの重複があることを示しています。 sqliteデータベースからのみ重複を削除するにはどうすればよいですか? (messdatumが同じであるanzahl-1レコードを削除する必要がありますか?)誰かアドバイスがありますか?

PS:私はこのリンクを見つけました Microsoftから重複を削除する方法 しかしsqlite方言に問題があります。 sqlite構文が原因でエラーが発生しました。だからf.e.私はそれをできた:

 INSERT into holdkey SELECT messdatum, count(*) as anzahl from lipo group by messdatum having count(*) > 1;

 INSERT into holddups SELECT DISTINCT lipo.* from lipo, holdkey where lipo.Messdatum = holdkey.messdatum ;

 DELETE lipo from lipo, holdkey where lipo.messdatum = holdkey.messdatum;

これが削除コマンドのエラーです。どうやってやるの? holdkey.anzahlをlipoの追加の列に更新しようとしました

UPDATE lipo,holdkey set lipo.duplettenzahl = holdkey.anzahl WHERE lipo.messdatum = holdkey.messdatum ; 

しかし、これも不可能です。リポのdublettenzahlとしてanzahlを使用する場合、dublettenzahl> 0のlipoからすべてのレコードを削除できます。助けてください。ありがとう

15

SQLiteには 特別な列、ROWID デフォルトですべてのテーブルに作成されます( スイッチをオフにするWITHOUT ROWID修飾子を使用できますが、非常にそうする前に必ず)。

これは、重複のセット内の特定の行を識別できることを意味します。たとえば、値の最初のエントリを見つけることができます。

SELECT messdatum, MIN(ROWID) FROM lipo

したがって、重複を削除する1つの方法は、次のようになります。

DELETE FROM lipo
WHERE rowid NOT IN (
  SELECT MIN(rowid) 
  FROM lipo 
  GROUP BY messdatum
)
33
Mike Woodhouse

私は解決策を得ました:

 INSERT into holdkey SELECT messdatum, count(*) as anzahl,NameISO from lipo group by messdatum having count(*) > 1;
 INSERT into holddups SELECT DISTINCT lipo.*,1 from lipo, holdkey where lipo.Messdatum = holdkey.messdatum group by messdatum;
 INSERT into lipo_mit_dz  SELECT *, count(*) as DublettenZahl from lipo group by messdatum ORDER BY Dublettenzahl desc ;
 DELETE from lipo_mit_dz where Dublettenzahl > 1;
 INSERT into lipo_mit_dz SELECT * from holddups ; 
0