バックティックは非標準の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(*)
一般的にはより適切です(そして少し速くなります)。