Поиск дубликатов строк с помощью PostgreSQL
У нас есть таблица фотографий со следующими столбцами:
id, merchant_id, url
Эта таблица содержит повторяющиеся значения для комбинации merchant_id, url
. так что вполне возможно, что одна строка появляется больше несколько раз.
234 some_merchant http://www.some-image-url.com/abscde1213
235 some_merchant http://www.some-image-url.com/abscde1213
236 some_merchant http://www.some-image-url.com/abscde1213
Как лучше всего удалить эти дубликаты? (Я использую PostgreSQL 9.2 и Rails 3.)
3 ответа:
Вот мой взгляд на это.
select * from ( SELECT id, ROW_NUMBER() OVER(PARTITION BY merchant_Id, url ORDER BY id asc) AS Row FROM Photos ) dups where dups.Row > 1
Не стесняйтесь играть с заказом, чтобы адаптировать записи, которые вы хотите удалить, к вашим спецификациям.
SQL Fiddle = > http://sqlfiddle.com/#! 15 / d6941/1/0
SQL Fiddle для Postgres 9.2 больше не поддерживается; обновление SQL Fiddle до postgres 9.3
Вторая часть ответа sgeddes не работает на Postgres (скрипка использует MySQL). Вот обновленная версия его ответа с использованием Postgres: http://sqlfiddle.com/#! 12 / 6b1a7/1
DELETE FROM Photos AS P1 USING Photos AS P2 WHERE P1.id > P2.id AND P1.merchant_id = P2.merchant_id AND P1.url = P2.url;
Я вижу пару вариантов для вас.
Для быстрого способа сделать это, Используйте что-то вроде этого (это предполагает, что ваш столбец ID не уникален, как вы упомянули 234 несколько раз выше):
CREATE TABLE tmpPhotos AS SELECT DISTINCT * FROM Photos; DROP TABLE Photos; ALTER TABLE tmpPhotos RENAME TO Photos;
Вот Скрипка SQL.
Вам нужно будет добавить свои ограничения обратно в таблицу, если они у вас есть.
Если ваш столбец ID уникален, вы можете сделать что-то вроде сохранения вашего самого низкого id:
DELETE FROM P1 USING Photos P1, Photos P2 WHERE P1.id > P2.id AND P1.merchant_id = P2.merchant_id AND P1.url = P2.url;
И Скрипка.