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