Apa cara terbaik untuk menemukan record dengan nilai duplikat di beberapa kolom menggunakan Postgres, dan Activerecord?
Saya menemukan solusi ini di sini :
User.find(:all, :group => [:first, :email], :having => "count(*) > 1" )
Tetapi tampaknya tidak berfungsi dengan postgres. Saya mendapatkan kesalahan ini:
PG :: GroupingError: ERROR: kolom "parts.id" harus muncul di klausa GROUP BY atau digunakan dalam fungsi agregat
ruby-on-rails
postgresql
activerecord
newUserNameHere
sumber
sumber
select a.id, b.id, name, email FROM user a INNER JOIN user b USING (name, email) WHERE a.id > b.id
. Tidak tahu bagaimana mengungkapkannya di ActiveRecord-speak.Jawaban:
Versi Teruji & Bekerja
Juga, ini sedikit tidak berhubungan tetapi berguna. Jika Anda ingin melihat berapa kali setiap kombinasi ditemukan, letakkan .size di akhir:
dan Anda akan mendapatkan hasil yang terlihat seperti ini:
Saya pikir itu cukup keren dan belum pernah melihatnya sebelumnya.
Penghargaan untuk Taryn, ini hanyalah versi tweak dari jawabannya.
sumber
select()
seperti:User.select([:first,:email]).group(:first,:email).having("count(*) > 1").count
untuk bekerja..count
memberiPG::UndefinedFunction: ERROR: function count
.size
sebagai pengganti.count
Kesalahan itu terjadi karena POSTGRES mengharuskan Anda untuk meletakkan kolom pengelompokan di klausa SELECT.
mencoba:
(catatan: tidak diuji, Anda mungkin perlu menyesuaikannya)
DIEDIT untuk menghapus kolom id
sumber
id
kolom bukan bagian dari kelompok, sehingga Anda tidak dapat merujuk kecuali Anda agregat (misalnyaarray_agg(id)
ataujson_agg(id)
)Jika Anda membutuhkan model lengkap, coba yang berikut ini (berdasarkan jawaban @ newUserNameHere's).
Ini akan mengembalikan baris di mana alamat email baris tersebut tidak unik.
Saya tidak mengetahui cara untuk melakukan ini pada beberapa atribut.
sumber
.select(:email)
ini berlebihan. Saya pikir ini sedikit lebih bersih, tetapi saya bisa saja salah.User.where(email: User.select(:email).group(:email).having("count(*) > 1"))
Dapatkan semua duplikat dengan satu kueri jika Anda menggunakan PostgreSQL :
sumber
Berdasarkan jawaban di atas oleh @newUserNameDi sini saya yakin cara yang tepat untuk menunjukkan hitungan masing-masing adalah
sumber