バックティックは非標準の 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 では使用できません。DISTINCT
count(*) OVER (...)
OVER
主制約または一意制約に関係なく、任意のテーブルで機能します。
1
in DISTINCT ON
andは、リストORDER BY
内のアイテムの序数を参照するための省略形です。SELECT
SQL Fiddleを使用して、両方を並べて示します。
この密接に関連する回答の詳細:
count(*)
対。count(id)
重複を探している場合は、 を使用するcount(*)
よりも使用する方が適していcount(id)
ます。id
if can beには微妙な違いがあります。これは、値がカウントされないNULL
ためNULL
です - whilecount(*)
はすべての行をカウントします。id
が定義されている場合NOT NULL
、結果は同じですが、count(*)
一般的にはより適切です (また、わずかに高速です)。