У меня есть таблица в базе данных PostgreSQL 8.3.8, которая не имеет ключей / ограничений и имеет несколько строк с точно такими же значениями.
Я хочу удалить все дубликаты и оставить только по одной копии каждой строки.
В частности, есть один столбец (с именем «ключ»), который может использоваться для идентификации дубликатов (т.е. должна существовать только одна запись для каждого отдельного «ключа»).
Как я могу это сделать? (в идеале с помощью одной команды SQL) Скорость в этом случае не проблема (есть только несколько строк).
sql
postgresql
duplicates
Андре Моружао
источник
источник
Более быстрое решение
источник
ctid
?Это быстро и кратко:
См. Также мой ответ в разделе Как удалить повторяющиеся строки без уникального идентификатора, в котором содержится дополнительная информация.
источник
ctid
указывает на физическое расположение записи в таблице. Вопреки тому, что я написал в то время в комментарии, использование оператора «меньше» не обязательно указывает на старую версию, поскольку ct может оборачиваться, а значение с более низким ctid может фактически быть более новым.min(ctid)
? а у вас новые? Спасибо!Я пробовал это:
предоставлено вики Postgres:
https://wiki.postgresql.org/wiki/Deleting_duplicates
источник
id
включая включенные.id
где дублируются столбцы 1 ... 3Я бы использовал временную таблицу:
Затем удалите
tab
и переименуйтеtab_temp
вtab
.источник
DROP TABLE IF EXISTS tmp; CREATE TABLE tmp as ( SELECT * from (SELECT DISTINCT * FROM your_table) as t ); DELETE from your_table; INSERT INTO your_table SELECT * from tmp; DROP TABLE tmp;
Пришлось создать свою версию. Версия, написанная @a_horse_with_no_name, слишком медленная для моей таблицы (21 миллион строк). А @rapimo просто не удаляет дубли.
Вот что я использую в PostgreSQL 9.5
источник
Другой подход (работает, только если у вас есть какое-либо уникальное поле, как
id
в вашей таблице), чтобы найти все уникальные идентификаторы по столбцам и удалить другие идентификаторы, которых нет в уникальном списке.источник
Как насчет:
Я был обеспокоен порядком выполнения, произойдет ли DELETE перед SELECT DISTINCT, но для меня это работает нормально. И имеет дополнительный бонус в виде отсутствия каких-либо знаний о структуре таблицы.
источник
json
), это не сработает.У меня это сработало. У меня была таблица, условия, содержащие повторяющиеся значения. Выполните запрос, чтобы заполнить временную таблицу всеми повторяющимися строками. Затем я запустил оператор удаления с этими идентификаторами во временной таблице. value - это столбец, содержащий дубликаты.
источник
Вот решение, использующее
PARTITION BY
:источник