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

Agrupar por cláusula en mySQL y postgreSQL, ¿por qué el error en postgreSQL?

Debe usar FUNCIÓN AGREGADA :

Las funciones agregadas calculan un único resultado a partir de un conjunto de valores de entrada.

SELECT col2, MIN(col3) AS col3, MIN(col1) AS col1
FROM the_table 
GROUP BY col2;

db<>demostración de violín

Manejo de MySQL de GROUP BY :

En SQL estándar, una consulta que incluye una cláusula GROUP BY no puede hacer referencia a columnas no agregadas en la lista de selección que no se nombran en la cláusula GROUP BY

y:

MySQL amplía el uso de GROUP BY para que la lista de selección pueda hacer referencia a columnas no agregadas que no se nombran en la cláusula GROUP BY. Esto significa que la consulta anterior es legal en MySQL. Puede utilizar esta característica para obtener un mejor rendimiento al evitar la clasificación y agrupación de columnas innecesarias. Sin embargo, esto es útil principalmente cuando todos los valores en cada columna no agregada no nombrada en GROUP BY son los mismos para cada grupo. El servidor es libre de elegir cualquier valor de cada grupo, por lo que, a menos que sean iguales, los valores elegidos son indeterminados

Entonces, con la versión de MySQL sin una función agregada explícita, puede terminar con valores no deterministas. Recomiendo encarecidamente utilizar una función agregada específica.

EDITAR:

De Manejo de MySQL de GROUP BY :

SQL92 y anteriores no permiten consultas para las cuales la lista de selección, la condición HAVING o la lista ORDER BY se refieren a columnas no agregadas que no se nombran en la cláusula GROUP BY.

SQL99 y versiones posteriores permiten tales no agregados por característica opcional T301 si son funcionalmente dependientes de las columnas GROUP BY: Si existe tal relación entre el nombre y el custid, la consulta es legal. Este sería el caso, por ejemplo, si se pusiera una clave primaria de clientes.

Ejemplo:

SELECT o.custid, c.name, MAX(o.payment)
FROM orders AS o
JOIN customers AS c
  ON o.custid = c.custid
GROUP BY o.custid;