Sie können SELECT *
nicht kombinieren mit GROUP BY some_column
in Postgres (es sei denn, some_column
ist die PK), denn das ist ein Widerspruch. Alle nicht aggregierten Spalten (verwendet in der SELECT
, HAVING
oder ORDER BY
-Klausel außerhalb einer Aggregatfunktion) muss in GROUP BY
enthalten sein list - wobei die Primärschlüsselspalte alle Spalten einer Tabelle ersetzen kann. Sonst ist es undefiniert was Wert, der aus dem aggregierten Satz ausgewählt werden soll.
Per Dokumentation:
Wenn GROUP BY
vorhanden ist oder Aggregatfunktionen vorhanden sind, ist es für SELECT
nicht gültig Listenausdrücke auf nicht gruppierte Spalten verweisen, außer innerhalb von Aggregatfunktionen oder wenn die nicht gruppierte Spalte funktional von den gruppierten Spalten abhängig ist, da es sonst mehr als einen möglichen Wert geben würde, der für eine nicht gruppierte Spalte zurückgegeben werden könnte. Eine funktionale Abhängigkeit besteht, wenn die gruppierten Spalten (oder eine Teilmenge davon) der Primärschlüssel der Tabelle sind, die die nicht gruppierte Spalte enthält.
Ein bestimmtes anderes RDBMS ist dafür bekannt, hier schmutzige Tricks zu spielen und dies zuzulassen und willkürliche Werte auszuwählen...
Anscheinend möchten Sie eine Liste mit einzelnen Patienten, die Kommentare abgegeben haben, mit den neuesten jeweils kommentieren. Der einfachste Weg in Postgres ist mit DISTINCT ON
:
SELECT DISTINCT ON (patient_id) *
FROM comments
WHERE clinician_id = $1
ORDER BY patient_id, created_at DESC NULLS LAST;
Aber das funktioniert nicht mit SQLite - was von vornherein nicht in der Schleife sein sollte:
- Generische Ruby-Lösung für SQLite3 "LIKE" oder PostgreSQL "ILIKE"?
NULLS LAST
ist nur relevant, wenn created_at
kann NULL sein:
- PostgreSQL sortiert nach datetime asc, null zuerst?
Details für DISTINCT ON
:
- Erste Zeile in jeder GROUP BY-Gruppe auswählen?