PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

GroupingError:FEHLER:Die Spalte muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden

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?