Обратните отметки са нещо нестандартно за MySQL. Използвайте каноничните двойни кавички, за да цитирате идентификатори (възможно и в MySQL). Тоест, ако вашата таблица всъщност се казва "MY_TABLE" (всички главни букви). Ако сте го нарекли (по-разумно) my_table (всички малки букви), тогава можете да премахнете двойните кавички или да използвате малки букви.
Също така използвам ct вместо 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;
Това работи, защото DISTINCT ON (специфичен за PostgreSQL), като DISTINCT (SQL-Standard), се прилагат след функцията на прозореца count(*) OVER (...) . Прозоречни функции
(с OVER клауза) изискват PostgreSQL 8.4 или по-нова версия и не са налични в MySQL.
Работи с всяка таблица, независимо от първични или уникални ограничения.
1 в DISTINCT ON и ORDER BY е просто съкращаване за позоваване на поредния номер на елемента в SELECT списък.
SQL Fiddle за да демонстрирате и двете едно до друго.
Повече подробности в този тясно свързан отговор:
count(*) спрямо count(id)
Ако търсите дубликати, по-добре е с count(*) отколкото с count(id) . Има фина разлика, ако id може да бъде NULL , защото NULL стойностите не се отчитат - докато count(*) брои всички редове. Ако id е дефиниран NOT NULL , резултатите са същите, но count(*) като цяло е по-подходящо (и малко по-бързо).