Подтвердить что ты не робот

Найти строки с несколькими повторяющимися полями с помощью Active Record, Rails & Postgres

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

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

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

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

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

4b9b3361

Ответ 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