Найти строки с несколькими повторяющимися полями с активной записью, рельсы и Postgres
каков наилучший способ найти записи с повторяющимися значениями в нескольких столбцах с помощью Postgres и Activerecord?
Я нашел это решение здесь:
User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
но это, кажется, не работает с postgres. Я получаю эту ошибку:
PG:: GroupingError: ERROR: column "parts.id" должен отображаться в предложении GROUP BY или использоваться в агрегатной функции
4 ответа:
Тестируемая И Рабочая Версия
User.select(:first,:email).group(:first,:email).having("count(*) > 1")
кроме того, это немного не связано, но удобный. Если вы хотите увидеть, как раз каждая комбинация была найдена, положите .посчитайте в конце:
User.select(:first,:email).group(:first,:email).having("count(*) > 1").size
и вы получите результат, который выглядит так:
{[nil, nil]=>512, ["Joe", "test@test.com"]=>23, ["Jim", "email2@gmail.com"]=>36, ["John", "email3@gmail.com"]=>21}
думаю, это было круто и не видел его раньше.
кредит Тарин, это всего лишь измененная версия ее ответа.
эта ошибка возникает, потому что POSTGRES требует, чтобы вы поместили столбцы группировки в предложение SELECT.
попробуй:
User.select(:first,:email).group(:first,:email).having("count(*) > 1").all
(примечание: не проверял, возможно, вам придется настроить его)
отредактировано для удаления столбца id
Если вам нужны полные модели, попробуйте следующее (на основе ответа @newUserNameHere).
User.where(email: User.select(:email).group(:email).having("count(*) > 1").select(:email))
это вернет строки, где адрес электронной почты строки не является уникальным.
Я не знаю, как это сделать по нескольким атрибутам.
на основе ответ выше по @newUserNameHere я считаю, что правильный способ показать количество для каждого является
res = User.select('first, email, count(1)').group(:first,:email).having('count(1) > 1') res.each {|r| puts r.attributes } ; nil