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?