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

GroupingError:ERROR:kolonnen skal vises i GROUP BY-sætningen eller bruges i en aggregeret funktion

Du kan ikke kombinere SELECT * med GROUP BY some_column i Postgres (medmindre some_column er PK), fordi det er en selvmodsigelse. Alle ikke-aggregerede kolonner (bruges i SELECT). , HAVING eller ORDER BY klausul uden for en aggregeret funktion) skal være i GROUP BY liste - hvor den primære nøglekolonne kan erstatte alle kolonner i en tabel. Ellers er det udefineret hvilket værdi at vælge fra det samlede sæt.

Per dokumentation:

Når GROUP BY er til stede, eller der er aggregerede funktioner til stede, er den ikke gyldig for SELECT listeudtryk for at referere til ugrupperede kolonner undtagen inden for aggregerede funktioner, eller når den ugrupperede kolonne er funktionelt afhængig af de grupperede kolonner, da der ellers ville være mere end én mulig værdi at returnere for en ugrupperet kolonne. Der eksisterer en funktionel afhængighed, hvis de grupperede kolonner (eller en undergruppe deraf) er den primære nøgle i tabellen, der indeholder den ugrupperede kolonne.

En bestemt anden RDBMS er kendt for at spille beskidte tricks her og tillade dette og vælge vilkårlige værdier...

Du ser ud til at have en liste over unikke patienter, der har kommenteret, med det seneste kommentere hver. Den enkleste måde i Postgres er med DISTINCT ON :

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

Men dette vil ikke flyve med SQLite - som ikke burde være i løkken til at begynde med:

  • Generisk Ruby-løsning til SQLite3 "LIKE" eller PostgreSQL "ILIKE"?

NULLS LAST er kun relevant, hvis created_at kan være NULL:

  • PostgreSQL sorteres efter datetime asc, null først?

Detaljer for DISTINCT ON :

  • Vælg første række i hver GROUP BY-gruppe?



  1. Forbind PHP til MSSQL via PDO ODBC

  2. ISDATE() Eksempler i SQL Server

  3. En peer-to-peer udlånsplatform datamodel

  4. MELLEM klausul versus <=OG>=