Se
user_id
é a CHAVE PRIMÁRIA então você precisa atualizar o PostgreSQL; as versões mais recentes manipularão corretamente o agrupamento pela chave primária. Se
user_id
não é exclusivo nem a chave primária para a relação 'estates' em questão, então esta consulta não faz muito sentido, pois o PostgreSQL não tem como saber qual valor a ser retornado para cada coluna de estates
onde várias linhas compartilham o mesmo user_id
. Você deve usar uma função agregada que expresse o que você deseja, como min
, max
, avg
, string_agg
, array_agg
, etc ou adicione a(s) coluna(s) de interesse ao GROUP BY
. Como alternativa, você pode reformular a consulta para usar
DISTINCT ON
e um ORDER BY
se você realmente quiser escolher uma linha um tanto arbitrária, embora eu realmente duvide que seja possível expressar isso via ActiveRecord. Alguns bancos de dados - incluindo SQLite e MySQL - escolherão apenas uma linha arbitrária. Isso é considerado incorreto e inseguro pela equipe do PostgreSQL, então o PostgreSQL segue o padrão SQL e considera tais consultas como erros.
Se você tem:
col1 col2
fred 42
bob 9
fred 44
fred 99
e você faz:
SELECT col1, col2 FROM mytable GROUP BY col1;
então é óbvio que você deve obter a linha:
bob 9
mas e o resultado para
fred
? Não há uma única resposta correta para escolher, portanto, o banco de dados se recusará a executar essas consultas inseguras. Se você queria o maior col2
para qualquer col1
você usaria o max
agregar:SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;