2016-11-21 71 views
1

我在我的Postgres數據庫中有一張表,我忘記插入一個唯一的索引。因爲那個指數現在我已經重複了價值。如何刪除重複的值?我想在字段translationset_Id和key上添加一個唯一的索引。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

我已經提高了你的答案,做得很好! –

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