Back-ticks adalah hal MySQL non-standar. Gunakan tanda kutip ganda kanonik untuk mengutip pengidentifikasi (mungkin juga di MySQL). Artinya, jika tabel Anda sebenarnya bernama "MY_TABLE" (semua huruf besar). Jika Anda (lebih bijak) menamakannya my_table (semua huruf kecil), maka Anda dapat menghapus tanda kutip ganda atau menggunakan huruf kecil.
Juga, saya menggunakan ct bukannya count sebagai alias, karena menggunakan nama fungsi sebagai pengidentifikasi adalah praktik yang buruk.
Kasus sederhana
Ini akan bekerja dengan PostgreSQL 9.1 :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
Ini membutuhkan kolom kunci utama di GROUP BY ayat. Hasilnya identik ke kueri MySQL, tetapi ct akan selalu 1 (atau 0 jika id IS NULL ) - tidak berguna untuk menemukan duplikat.
Kelompokkan menurut selain kolom kunci utama
Jika Anda ingin mengelompokkan berdasarkan kolom lain, semuanya menjadi lebih rumit. Kueri ini meniru perilaku kueri MySQL Anda - dan Anda bisa gunakan * .
SELECT DISTINCT ON (1, some_column)
count(*) OVER (PARTITION BY some_column) AS ct
,*
FROM my_table
ORDER BY 1 DESC, some_column, id, col1;
Ini berfungsi karena DISTINCT ON (khusus PostgreSQL), seperti DISTINCT (SQL-Standar), diterapkan setelah fungsi jendela count(*) OVER (...) . Fungsi jendela
(dengan OVER klausa) memerlukan PostgreSQL 8.4 atau lebih baru dan tidak tersedia di MySQL.
Bekerja dengan tabel apa pun, terlepas dari batasan utama atau unik.
1 di DISTINCT ON dan ORDER BY hanyalah singkatan untuk merujuk ke nomor urut item di SELECT daftar.
SQL Fiddle untuk mendemonstrasikan keduanya secara berdampingan.
Detail lebih lanjut dalam jawaban yang terkait erat ini:
count(*) vs. count(id)
Jika Anda mencari duplikat, Anda lebih baik menggunakan count(*) dibandingkan dengan count(id) . Ada sedikit perbedaan jika id bisa NULL , karena NULL nilai tidak dihitung - sementara count(*) menghitung semua baris. Jika id didefinisikan NOT NULL , hasilnya sama, tapi count(*) umumnya lebih tepat (dan sedikit lebih cepat juga).