Поиск повторяющихся строк с помощью 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.)

889   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 Fiddle.

вам нужно будет добавить свои ограничения обратно в таблицу, если они у вас есть.

Если ваш столбец 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;  

и Скрипка.

Comments

    Ничего не найдено.