sql >> Base de Datos >  >> RDS >> Mysql

Equivalente de PostgreSQL para MySQL GROUP BY

Los back-ticks son algo no estándar de MySQL. Use las comillas dobles canónicas para citar identificadores (también es posible en MySQL). Es decir, si su tabla de hecho se llama "MY_TABLE" (todo en mayúsculas). Si (más sabiamente) lo llamaste my_table (todo en minúsculas), luego puede eliminar las comillas dobles o usar minúsculas.

Además, uso ct en lugar de count como alias, porque es una mala práctica usar nombres de funciones como identificadores.

Caso sencillo

Esto funcionaría con PostgreSQL 9.1 :

SELECT *, count(id) ct
FROM   my_table
GROUP  BY primary_key_column(s)
ORDER  BY ct DESC;

Requiere columna(s) de clave principal en GROUP BY cláusula. Los resultados son idénticos a una consulta MySQL, pero ct siempre sería 1 (o 0 si id IS NULL ) - inútil para encontrar duplicados.

Agrupar por columnas que no sean de clave principal

Si desea agrupar por otra(s) columna(s), las cosas se complican más. Esta consulta imita el comportamiento de su consulta MySQL, y usted puede usa * .

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;

Esto funciona porque DISTINCT ON (Específico de PostgreSQL), como DISTINCT (SQL-Standard), se aplican después la función de ventana count(*) OVER (...) . Funciones de ventana (con el OVER cláusula) requieren PostgreSQL 8.4 o posterior y no están disponibles en MySQL.

Funciona con cualquier tabla, independientemente de las restricciones primarias o únicas.

El 1 en DISTINCT ON y ORDER BY es solo una abreviatura para referirse al número ordinal del elemento en el SELECT lista.

SQL Fiddle para demostrar ambos uno al lado del otro.

Más detalles en esta respuesta estrechamente relacionada:

count(*) frente a count(id)

Si está buscando duplicados, es mejor que use count(*) que con count(id) . Hay una sutil diferencia si id puede ser NULL , porque NULL los valores no se cuentan, mientras que count(*) cuenta todas las filas. Si id se define NOT NULL , los resultados son los mismos, pero count(*) es generalmente más apropiado (y un poco más rápido también).