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).