Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PostgreSQL equivalente para MySQL GROUP BY


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).