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

GroupingError:ERROR:la colonna deve essere presente nella clausola GROUP BY o essere utilizzata in una funzione di aggregazione

Non puoi combinare SELECT * con GROUP BY some_column in Postgres (a meno che some_column è il PK), perché è una contraddizione. Tutte le colonne non aggregate (usate in SELECT , HAVING o ORDER BY clausola al di fuori di una funzione aggregata) deve trovarsi in GROUP BY list - dove la colonna della chiave primaria può sostituire tutte le colonne di una tabella. Altrimenti non è definito quale valore da scegliere dall'insieme aggregato.

Per documentazione:

Quando GROUP BY è presente, o sono presenti funzioni aggregate, non è valido per SELECT list le espressioni per fare riferimento a colonne non raggruppate tranne all'interno di funzioni aggregate o quando la colonna non raggruppata dipende funzionalmente dalle colonne raggruppate, poiché altrimenti ci sarebbe più di un valore possibile da restituire per una colonna non raggruppata. Esiste una dipendenza funzionale se le colonne raggruppate (o un loro sottoinsieme) sono la chiave primaria della tabella contenente la colonna non raggruppata.

È noto che un certo altro RDBMS gioca brutti scherzi qui e lo consente e sceglie valori arbitrari...

Sembra che tu voglia un elenco di pazienti unici che hanno commentato, con le più recenti commenta ciascuno. Il modo più semplice in Postgres è con DISTINCT ON :

SELECT DISTINCT ON (patient_id) *
FROM   comments
WHERE  clinician_id = $1
ORDER  BY patient_id, created_at DESC NULLS LAST;

Ma questo non volerà con SQLite, che non dovrebbe essere nel ciclo per cominciare:

  • Soluzione Ruby generica per SQLite3 "LIKE" o PostgreSQL "ILIKE"?

NULLS LAST è rilevante solo se created_at può essere NULL:

  • PostgreSQL ordina per datetime asc, null prima?

Dettagli per DISTINCT ON :

  • Seleziona la prima riga in ogni gruppo GROUP BY?