Найти строки с несколькими повторяющимися полями с активной записью, рельсы и Postgres


каков наилучший способ найти записи с повторяющимися значениями в нескольких столбцах с помощью Postgres и Activerecord?

Я нашел это решение здесь:

User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )

но это, кажется, не работает с postgres. Я получаю эту ошибку:

PG:: GroupingError: ERROR: column "parts.id" должен отображаться в предложении GROUP BY или использоваться в агрегатной функции

4 69

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