2016-11-21 6 views
1

私はユニークなインデックスを挿入するのを忘れた私のPostgresデータベースにテーブルを持っています。そのインデックスのために私は現在値を複製しています。重複した値を削除するには?私はフィールドtranslationset_Idとキーにユニークなインデックスを追加したいと思います。PostgresSQL重複した値を削除する方法

enter image description here

+2

削除したいどの値説明。 – jarlh

+0

安全な削除のために[参照してください](http://donotforgetitmaster.blogspot.in/2014/08/delete-duplicate-data-from-redshift.html) – Viki888

+0

2番目のレコード、4番目のレコード、7番目のレコード、 11番目のレコードと13番目のレコード。 (画像参照) –

答えて

1

あなたが唯一のtranslationset_id列に関しては、重複しているレコードを削除することが表示されます。この場合、Postgresの行番号機能を使用して重複行を識別し、それらの重複を削除することができます。

WITH cte AS 
(
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY translationset_id, key) AS rnum 
    FROM yourTable t 
) 

DELETE FROM yourTable 
WHERE translationset_id IN (SELECT translationset_id FROM cte WHERE rnum > 1) 
+0

キーの列はどこですか? "私はprtScrを更新しました" –

+0

@CecilBoye感謝の言葉を更新しました。 –

4

私はあなたがこのために求めていると思う:

DELETE FROM tablename WHERE id IN (SELECT id FROM (SELECT id, ROW_NUMBER() OVER (partition BY column1, column2, column3 ORDER BY id) AS rnum FROM tablename) t WHERE t.rnum > 1);

+0

これは完全ではないかもしれません。パーティションは 'translationset_id'カラムと' key'カラムにのみ存在し、他のカラムは存在しないように見えます。 –

+0

これはあなたが問題を解決するために従うことができる青写真のようなものです。私は主にこの手順を覚えておくためにこれを使用します。 – Kostasfra

+0

私はあなたの答え、良い仕事upvotedしている! –

0
delete from mytable 
where exists (select 1 
       from mytable t2 
       where t2.name = mytable.name and 
        t2.address = mytable.address and 
        t2.zip = mytable.zip and 
        t2.ctid > mytable.ctid 
      ); 
関連する問題