Удалить повторяющиеся строки (не удалять все дубликаты)
Я использую 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 );