Удаление повторяющихся записей на основе нескольких столбцов
В нашей системе мы запускаем ежечасный импорт из внешней базы данных. Из-за ошибки в сценариях импорта теперь есть несколько повторяющихся записей.
Дубликат считается, где любая запись имеет те же :legacy_id
и :company
.
Какой код можно запустить для поиска и удаления этих дубликатов?
Я играл с этим:
Product.select(:legacy_id,:company).group(:legacy_id,:company).having("count(*) > 1")
Казалось, что он возвратил некоторые из дубликатов, но я не был уверен, как удалить оттуда?
Любые идеи?
Ответы
Ответ 1
Вы можете попробовать следующий подход:
Product.group_by { |x| [x.legacy_id, x.company] }
.flat_map { |_,x| x.drop(1) }
.delete_all
Или чистый ActiveRecord:
Product.where.not(id: Product.group(:legacy_id, :company).pluck('min(products.id)'))
.delete_all
Или чистый sql:
delete from products
where id not in (
select min(p.id) from products p group by p.legacy_id, p.company
)