Quelle est la meilleure façon de trouver des enregistrements avec des valeurs en double sur plusieurs colonnes à l'aide de Postgres et d'Activerecord ?
J'ai trouvé cette solution ici:
User.find(:all,:group => [:first,:email],:having => "count(*) > 1" )
Mais cela ne semble pas fonctionner avec postgres. J'obtiens cette erreur :
PG::GroupingError : ERREUR : la colonne "parts.id" doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation
Solution du problème
Version testée et fonctionnelle
User.select(:first,:email).group(:first,:email).having("count(*) > 1")
De plus, c'est un peu sans rapport mais pratique. Si vous voulez voir combien de fois chaque combinaison a été trouvée, mettez.size à la fin :
User.select(:first,:email).group(:first,:email).having("count(*) > 1").size
et vous obtiendrez un ensemble de résultats qui ressemble à ceci :
{[nil, nil]=>512,
["Joe", "test@test.com"]=>23,
["Jim", "email2@gmail.com"]=>36,
["John", "email3@gmail.com"]=>21}
Je pensais que c'était plutôt cool et je ne l'avais jamais vu auparavant.
Merci à Taryn, ce n'est qu'une version modifiée de sa réponse.
Aucun commentaire:
Enregistrer un commentaire