sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL:debe aparecer en la cláusula GROUP BY o usarse en una función agregada

Si user_id es la CLAVE PRINCIPAL entonces necesita actualizar PostgreSQL; las versiones más nuevas manejarán correctamente la agrupación por clave principal.

Si user_id no es único ni la clave principal para la relación 'estados' en cuestión, entonces esta consulta no tiene mucho sentido, ya que PostgreSQL no tiene forma de saber cuál valor a devolver para cada columna de estates donde varias filas comparten el mismo user_id . Debe usar una función agregada que exprese lo que desea, como min , max , avg , string_agg , array_agg , etc. o agregue la(s) columna(s) de interés al GROUP BY .

Alternativamente, puede reformular la consulta para usar DISTINCT ON y un ORDER BY si realmente desea elegir una fila algo arbitraria, aunque realmente dudo que sea posible expresar eso a través de ActiveRecord.

Algunas bases de datos, incluidas SQLite y MySQL, simplemente elegirán una fila arbitraria. El equipo de PostgreSQL considera que esto es incorrecto e inseguro, por lo que PostgreSQL sigue el estándar SQL y considera tales consultas como errores.

Si tienes:

col1    col2
fred    42
bob     9
fred    44
fred    99

y lo haces:

SELECT col1, col2 FROM mytable GROUP BY col1;

entonces es obvio que debería obtener la fila:

bob     9

pero ¿qué pasa con el resultado de fred ? No hay una sola respuesta correcta para elegir, por lo que la base de datos se negará a ejecutar consultas tan inseguras. Si querías lo mejor col2 para cualquier col1 usarías el max agregado:

SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;