Back-ticks são uma coisa não padrão do MySQL. Use as aspas duplas canônicas para citar identificadores (possível no MySQL também). Ou seja, se sua tabela de fato se chama
"MY_TABLE"
(todos em maiúsculas). Se você (mais sabiamente) o nomeou my_table
(todos em minúsculas), então você pode remover as aspas duplas ou usar letras minúsculas. Além disso, eu uso
ct
em vez de count
como alias, porque é uma prática ruim usar nomes de funções como identificadores. Caso simples
Isso funcionaria com PostgreSQL 9.1 :
SELECT *, count(id) ct
FROM my_table
GROUP BY primary_key_column(s)
ORDER BY ct DESC;
Requer coluna(s) de chave primária no
GROUP BY
cláusula. Os resultados são idênticos para uma consulta MySQL, mas ct
seria sempre 1 (ou 0 se id IS NULL
) - inútil para encontrar duplicatas. Agrupar por colunas que não sejam de chave primária
Se você quiser agrupar por outra(s) coluna(s), as coisas ficam mais complicadas. Esta consulta imita o comportamento de sua consulta MySQL - e você pode use
*
. 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;
Isso funciona porque
DISTINCT ON
(específico do PostgreSQL), como DISTINCT
(SQL-Standard), são aplicados depois a função de janela count(*) OVER (...)
. Funções de janela
(com o OVER
cláusula) requerem PostgreSQL 8.4 ou posterior e não estão disponíveis no MySQL. Funciona com qualquer tabela, independentemente das restrições primárias ou exclusivas.
O
1
em DISTINCT ON
e ORDER BY
é apenas um atalho para se referir ao número ordinal do item no SELECT
Lista. SQL Fiddle para demonstrar ambos lado a lado.
Mais detalhes nesta resposta intimamente relacionada:
count(*)
vs. count(id)
Se você estiver procurando por duplicatas, é melhor usar
count(*)
do que com count(id)
. Há uma diferença sutil se id
pode ser NULL
, porque NULL
os valores não são contados - enquanto count(*)
conta todas as linhas. Se id
está definido NOT NULL
, os resultados são os mesmos, mas count(*)
é geralmente mais apropriado (e um pouco mais rápido também).