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