Trouver des lignes en double avec PostgreSQL

Nous avons un tableau de photos avec les colonnes suivantes:

id, merchant_id, url 

cette table contient des valeurs en double pour la combinaison merchant_id, url . il est donc possible qu’une rangée apparaisse plus plusieurs fois.

 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 

Quelle est la meilleure façon de supprimer ces doublons? (J’utilise PostgreSQL 9.2 et Rails 3.)

Voici mon sharepoint vue.

 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 

N’hésitez pas à jouer avec la commande pour adapter les enregistrements que vous souhaitez supprimer à vos spécifications.

Violon SQL => http://sqlfiddle.com/#!15/d6941/1/0


SQL Fiddle for Postgres 9.2 n’est plus pris en charge. mettre à jour SQL Fiddle vers postgres 9.3

La deuxième partie de la réponse de sgeddes ne fonctionne pas sur Postgres (le violon utilise MySQL). Voici une version mise à jour de sa réponse en utilisant 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; 

Je vois quelques options pour vous.

Pour un moyen rapide de le faire, utilisez quelque chose comme ça (cela suppose que votre colonne d’identifiant n’est pas unique, car vous mentionnez 234 fois plus haut):

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

Voici le violon SQL .

Vous devrez append vos contraintes à la table si vous en avez.

Si votre colonne d’identification est unique, vous pouvez faire quelque chose comme garder votre identifiant le plus bas:

 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; 

Et le violon