Как лучше всего найти записи с повторяющимися значениями в нескольких столбцах с помощью Postgres и Activerecord?
Я нашел это решение здесь :
User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
Но, похоже, это не работает с postgres. Я получаю такую ошибку:
PG :: GroupingError: ОШИБКА: столбец "parts.id" должен появиться в предложении GROUP BY или использоваться в агрегатной функции
ruby-on-rails
postgresql
activerecord
newUserNameHere
источник
источник
select a.id, b.id, name, email FROM user a INNER JOIN user b USING (name, email) WHERE a.id > b.id
. Не знаю, как выразить это на языке ActiveRecord.Ответы:
Протестированная и рабочая версия
Кроме того, это немного не связано, но удобно. Если вы хотите узнать, сколько раз была найдена каждая комбинация, поместите в конце .size:
и вы получите результат, который выглядит так:
Думал, что это было круто, и раньше этого не видел.
Благодарим Тарин, это всего лишь измененная версия ее ответа.
источник
select()
as in:User.select([:first,:email]).group(:first,:email).having("count(*) > 1").count
для работы..count
даетPG::UndefinedFunction: ERROR: function count
.size
вместо.count
Эта ошибка возникает из-за того, что POSTGRES требует, чтобы вы поместили столбцы группировки в предложение SELECT.
пытаться:
(примечание: не тестировалось, возможно, придется его настроить)
ИЗМЕНИТЬ, чтобы удалить столбец идентификатора
источник
id
столбец не является частью группы, так что вы не можете передать его , если вы не агрегировать его (например ,array_agg(id)
илиjson_agg(id)
)Если вам нужны полные модели, попробуйте следующее (на основе ответа @ newUserNameHere).
Это вернет строки, в которых адрес электронной почты строки не уникален.
Я не знаю, как это сделать с несколькими атрибутами.
источник
.select(:email)
избыточно. Я думаю, что это немного чище, но я могу ошибаться.User.where(email: User.select(:email).group(:email).having("count(*) > 1"))
Получите все дубликаты одним запросом, если вы используете PostgreSQL :
источник
Основываясь на ответе @newUserName выше , я считаю, что правильный способ показать количество для каждого -
источник