web-dev-qa-db-ja.com

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。

66
Stefan Schmidt

ここに私の見解があります。

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 Fiddle => http://sqlfiddle.com/#!15/d6941/1/


SQL Fiddleはサポートされなくなりました。SQLFiddleをpostgres 9.3に更新

118
MatthewJ

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;  
9
11101101b

いくつかの選択肢があります。

簡単に行うには、次のようなものを使用します(上記の234を何度も言及したように、ID列は一意ではないことを前提としています)。

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

SQL Fiddle です。

制約がある場合は、テーブルに戻す必要があります。

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

6
sgeddes