バックティックは非標準のMySQLのものです。正規の二重引用符を使用して識別子を引用します(MySQLでも可能です)。つまり、テーブルの名前が実際に"MY_TABLE"である場合 (すべて大文字)。 (より賢明に)my_tableという名前を付けた場合 (すべて小文字)場合は、二重引用符を削除するか、小文字を使用できます。
また、私はctを使用します countの代わりに 関数名を識別子として使用するのは悪い習慣なので、エイリアスとして。
シンプルなケース
これはPostgreSQL9.1で機能します :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
GROUP BYに主キー列が必要です 句。結果は同一です MySQLクエリに変換しますが、ct 常に1(またはid IS NULLの場合は0)になります )-重複を見つけるのに役に立たない。
主キー列以外でグループ化
他の列でグループ化したい場合は、事態はさらに複雑になります。このクエリはMySQLクエリの動作を模倣しており、できます *を使用する 。
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;
これは、DISTINCT ONが機能するために機能します (PostgreSQL固有)DISTINCTなど (SQL標準)、後に適用されます ウィンドウ関数count(*) OVER (...) 。 ウィンドウ関数
(OVERを使用 条項)PostgreSQL 8.4が必要 以降、MySQLでは使用できません。
主要な制約や一意の制約に関係なく、任意のテーブルで機能します。
1 DISTINCT ON およびORDER BY SELECT内のアイテムの序数を参照するための省略形です。 リスト。
SQLフィドル 両方を並べてデモンストレーションします。
この密接に関連する回答の詳細:
count(*) vs. count(id)
重複を探している場合は、count(*)を使用することをお勧めします count(id)よりも 。 idの場合、微妙な違いがあります NULLにすることができます 、NULL 値はカウントされません-count(*) すべての行をカウントします。 idの場合 定義されているNOT NULL 、結果は同じですが、count(*) 一般的にはより適切です(そして少し速くなります)。