Найти повторяющиеся строки с 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.)
Ответы
Ответ 1
Вот мой пример.
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
Ответ 2
Вторая часть ответа 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;
Ответ 3
Я вижу пару вариантов для вас.
Чтобы быстро сделать это, используйте что-то вроде этого (предполагается, что ваш столбец ID не уникален, поскольку вы упоминаете 234 раза больше):
CREATE TABLE tmpPhotos AS SELECT DISTINCT * FROM Photos;
DROP TABLE Photos;
ALTER TABLE tmpPhotos RENAME TO Photos;
Вот SQL Fiddle.
Вам нужно будет добавить свои ограничения обратно в таблицу, если у вас есть.
Если ваш столбец идентификатора уникален, вы можете сделать что-то вроде своего низкого идентификатора:
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;
И Fiddle.