2016-11-21 4 views
1

Ich habe eine Tabelle in meiner Postgres-Datenbank, wo ich vergessen habe, einen eindeutigen Index einzufügen. Wegen dieses Index habe ich jetzt Werte dupliziert. Wie entferne ich die doppelten Werte? Ich möchte einen eindeutigen Index für die Felder translationset_Id und key hinzufügen.PostgresSQL wie doppelte Werte zu löschen

enter image description here

+2

Beschreiben Sie, welche Werte Sie entfernen möchten. – jarlh

+0

Zum sicheren Löschen [Verweise] (http://donotforgetitmaster.blogspot.in/2014/08/delete-duplicate-dato-from-redshift.html) – Viki888

+0

Ich möchte den 2. Datensatz, den 4. Datensatz, den 7. Datensatz entfernen. 11. Rekord und 13. Rekord. (siehe Bild) –

Antwort

1

Es scheint, dass Sie nur die Datensätze löschen möchten, die in Bezug auf die translationset_id Spalte Duplikat sind. In diesem Fall können wir die Zeilennummernfunktion von Postgres verwenden, um zwischen doppelten Zeilen zu unterscheiden und diese Duplikate zu löschen.

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

Wo ist die Schlüsselspalte? "Ich habe den prtScr aktualisiert" –

+0

@CecilBoye Ich habe aktualisiert danke. –

4

Ich glaube, Sie für diese fragen:

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

Dies ist möglicherweise nicht vollständig korrekt. Es scheint, dass die Partition nur in den Spalten 'translationset_id' und' key' liegen sollte, nicht in anderen. –

+0

Nun, das ist wie eine Blaupause, der Sie folgen können, um Ihr Problem zu lösen. Ich benutze es meistens für die Erinnerung an die Prozedur. – Kostasfra

+0

Ich habe Ihre Antwort verbessert, gute Arbeit! –

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 
      );