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?