Se user_id
è la PRIMARY KEY allora è necessario aggiornare PostgreSQL; le versioni più recenti gestiranno correttamente il raggruppamento con la chiave primaria.
Se user_id
non è né unico né la chiave primaria per la relazione 'proprietà' in questione, allora questa query non ha molto senso, dal momento che PostgreSQL non ha modo di sapere che valore da restituire per ogni colonna di estates
dove più righe condividono lo stesso user_id
. È necessario utilizzare una funzione di aggregazione che esprima ciò che si desidera, ad esempio min
, max
, avg
, string_agg
, array_agg
, ecc. O aggiungere la/le colonna/i di interesse allo GROUP BY
.
In alternativa è possibile riformulare la query per utilizzare DISTINCT ON
e un ORDER BY
se si desidera effettivamente selezionare una riga un po 'arbitraria, anche se dubito davvero che sia possibile esprimerlo tramite ActiveRecord.
Alcuni database, tra cui SQLite e MySQL, selezionano solo una riga arbitraria. Questo è considerato non corretto e non sicuro dal team di PostgreSQL, quindi PostgreSQL segue lo standard SQL e considera tali query come errori.
se si dispone di:
col1 col2
fred 42
bob 9
fred 44
fred 99
e lo fai:
SELECT col1, col2 FROM mytable GROUP BY col1;
allora è ovvio che si dovrebbe ottenere la riga:
bob 9
ma per quanto riguarda il risultato fred
? Non esiste un'unica risposta corretta da selezionare, quindi il database rifiuterà di eseguire query non sicure. Se si voleva la grandecol2
per qualsiasi col1
devi utilizzare il max
aggregata:
SELECT col1, max(col2) AS max_col2 FROM mytable GROUP BY col1;
fonte
2013-08-05 15:04:34
con GROUP BY in PostgreSQL, non è possibile utilizzare la colonna nell'elenco di selezione se non lo si utilizza in gruppo per. Non so come tradurlo in rotaie –
Correlati: http://stackoverflow.com/q/19601948/398670 –
Possibile duplicato: http://stackoverflow.com/questions/19601948/must-appear-in-the- group-by-clause-or-be-used-in-an-aggregate-function –