PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL -deve apparire nella clausola GROUP BY o essere utilizzato in una funzione aggregata

Se user_id è la CHIAVE PRIMARIA quindi è necessario aggiornare PostgreSQL; le versioni più recenti gestiranno correttamente il raggruppamento in base alla chiave primaria.

Se user_id non è né univoco la chiave primaria per la relazione 'estates' in questione, quindi questa query non ha molto senso, poiché PostgreSQL non ha modo di sapere quale valore da restituire per ogni colonna di estates dove più righe condividono lo stesso user_id . Devi utilizzare una funzione aggregata che esprima ciò che desideri, ad esempio min , max , avg , string_agg , array_agg , ecc. oppure aggiungi la/le colonna/e di interesse a GROUP BY .

In alternativa puoi riformulare la query per utilizzare DISTINCT ON e un ORDER BY se vuoi davvero scegliere una riga alquanto arbitraria, anche se dubito davvero che sia possibile esprimerla tramite ActiveRecord.

Alcuni database, inclusi SQLite e MySQL, sceglieranno semplicemente 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 hai:

col1    col2
fred    42
bob     9
fred    44
fred    99

e tu lo fai:

SELECT col1, col2 FROM mytable GROUP BY col1;

quindi è ovvio che dovresti ottenere la riga:

bob     9

ma per quanto riguarda il risultato per fred ? Non esiste un'unica risposta corretta da scegliere, quindi il database si rifiuterà di eseguire tali query non sicure. Se volevi il più grande col2 per qualsiasi col1 useresti il ​​max aggregato:

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