Удалить повторяющиеся строки (не удалять все дубликаты)

Я использую postgres. Я хочу удалить повторяющиеся строки. Условие состоит в том, что 1 копия из набора повторяющихся строк не будет удалена.

i.e: если есть 5 повторяющихся записей, то 4 из них будут удалены.

Ответ 1

Попробуйте шаги, описанные в этой статье: Удаление дубликатов из базы данных PostgreSQL.

В нем описывается ситуация, когда вам приходится иметь дело с огромным количеством данных, которое невозможно для group by.

Простым решением было бы следующее:

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

Где hash - это то, что дублируется.

Ответ 2

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

Это случайное (максимальное значение) выбор, какую строку нужно сохранить. Если у вас есть aggre whit this, пожалуйста, предоставьте более подробную информацию

Ответ 3

Самый быстрый - это объединение в одну и ту же таблицу. 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)

Ответ 4

delete from table t1 
where rowid > (SELECT min(rowid) FROM table t2 group by 
               t2.id,t2.name );