2013-01-23 7 views
59

との重複行を検索当社は、次の列と写真のテーブルを持っている:PostgreSQLの

id, merchant_id, url 

この表は組み合わせmerchant_id, urlについて重複する値が含まれています。 1つの行が複数回表示される可能性があります。

234 some_merchant http://www.some-image-url.com/abscde1213 
235 some_merchant http://www.some-image-url.com/abscde1213 
236 some_merchant http://www.some-image-url.com/abscde1213 

これらの複製を削除するにはどうすればよいでしょうか? (私はPostgreSQL 9.2とRails 3を使用しています)

+1

あなたのIDカラムは一意ですか?私は234回3回見ますが、merchant_idとurlは重複した値であると言います。 – sgeddes

+0

http://stackoverflow.com/questions/1746213/how-to-delete-duplicate-entries-in-postgresql –

+0

の重複の可能性があります。混乱して申し訳ありません。上記の例のidは一意である必要があります。正しい編集をしてくれてありがとう。私の場合、ここのソリューションはstackoverflow.com/questions/1746213/...は機能しません。 –

答えて

105

ここに私のそれがあります。

select * from (
    SELECT id, 
    ROW_NUMBER() OVER(PARTITION BY merchant_Id, url ORDER BY id asc) AS Row 
    FROM Photos 
) dups 
where 
dups.Row > 1 

あなたの仕様に合わせて削除したいレコードを自由にカスタマイズすることができます。

SQLフィドル=>http://sqlfiddle.com/#!15/d6941/1/0


SQLフィドルはPostgresの9.2のためにサポートされなくなりました。 SQL Fiddleをpostgresに更新する9.3

+2

これは魅力的ですが、このクエリを使用して見つかった重複を削除しますか? –

+1

注意してください http://sqlfiddle.com/#!12/796d6/133 – MatthewJ

+0

同じことが3回繰り返されると、テイク2とテイク3が取り込まれます。どうすれば解決できますか? –

6

いくつかのオプションがあります。

CREATE TABLE tmpPhotos AS SELECT DISTINCT * FROM Photos; 
DROP TABLE Photos; 
ALTER TABLE tmpPhotos RENAME TO Photos; 

ここSQL Fiddleがある。それを行うための簡単な方法については

は、この(それはあなたが上記の234を複数回言及として、あなたのID列が一意でないと仮定し)のようなものを使用します。

テーブルに制約を追加する必要があります。あなたのID列が一意である場合は、あなたの最も小さいIDを維持したい

、あなたが何かをすることができます:

DELETE FROM P1 
USING Photos P1, Photos P2 
WHERE P1.id > P2.id 
    AND P1.merchant_id = P2.merchant_id 
    AND P1.url = P2.url; 

Fiddleを。

+2

私の場合、idは一意です。私はちょうど私の例のコードで間違っていた。 2番目のソリューションを使用しようとするとエラーが発生します。 'ERROR:relation" p1 "does not exist" –

+0

@StefanSchmidt MySQLの代わりにPostgresを実行するように修正しました:http://sqlfiddle.com/#!12/6b1a7/1 – 11101101b

8

sgeddesの回答の2番目の部分は、Postgresでは動作しません(MySQLはフィドルを使用します)。 Postgresを使って彼の答えを更新したバージョンです:http://sqlfiddle.com/#!12/6b1a7/1

DELETE FROM Photos AS P1 
USING Photos AS P2 
WHERE P1.id > P2.id 
    AND P1.merchant_id = P2.merchant_id 
    AND P1.url = P2.url;