2010-09-23 235 views
12

我正在使用postgres。 我想删除重复的行。 条件是,重复行集合中的1个副本不会被删除。删除重复行(不要删除所有重复)

即:如果有5个重复记录,则其中4个将被删除。

+1

的可能重复[如何删除与SQL重复行?(http://stackoverflow.com/questions/1173963/how-to-delete-duplicate-rows-with-sql) – 2010-09-23 11:08:40

+1

如何具有讽刺意味!大声笑'如何删除重复的可能重复'... – 2012-02-24 21:18:20

回答

17

尝试本文中描述的步骤:Removing duplicates from a PostgreSQL database

它描述了一种情况,当你不得不处理大量的数据时,这是不可能的,以至于group by

简单的解决办法是这样的:

DELETE FROM foo 
     WHERE id NOT IN (SELECT min(id) --or max(id) 
         FROM foo 
         GROUP BY hash) 

哪里hash是一些被复制。

+0

不会删除所有没有重复的行吗? – pomarc 2012-02-16 07:52:20

+0

@pomarc否,因为在1之前有这个小小的等号(=),告诉我们我们想要取所有可能的组的min(id),即使那些只包含一个成员的组也是如此。所以,不用担心,你不会删除没有重复的数据。 – 2012-02-16 21:31:40

+0

是有数量(*)> = 1的数字吗?我得到了相同的结果,如果我执行:DELETE FROM foo WHERE ID NOT IN(SELECT min(id) FROM foo GROUP BY hash) – grteibo 2012-02-24 13:26:02

2
delete from table 
where not id in 
(select max(id) from table group by [duplicate row]) 

这是随机的(最大值)选择你需要保留哪一行。 如果您有聚集的东西,请提供更多详细信息

1

最快的是加入同一张表。 http://www.postgresql.org/docs/8.1/interactive/sql-delete.html

CREATE TABLE test(id INT,id2 INT); 
CREATE TABLE 
mapy=# INSERT INTO test VALUES(1,2); 
INSERT 0 1 
mapy=# INSERT INTO test VALUES(1,3); 
INSERT 0 1 
mapy=# INSERT INTO test VALUES(1,4); 
INSERT 0 1 

DELETE FROM test t1 USING test t2 WHERE t1.id=t2.id AND t1.id2<t2.id2; 
DELETE 2 
mapy=# SELECT * FROM test; 
id | id2 
----+----- 
    1 | 4 
(1 row)