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;