U kunt SELECT *
niet combineren met GROUP BY some_column
in Postgres (tenzij some_column
is de PK), want dat is een contradictie. Alle niet-geaggregeerde kolommen (gebruikt in de SELECT
, HAVING
of ORDER BY
clausule buiten een aggregatiefunctie) moet in de GROUP BY
. staan lijst - waarbij de primaire sleutelkolom alle kolommen van een tabel kan vervangen. Anders is het niet gedefinieerd welke waarde om uit de geaggregeerde set te kiezen.
Per documentatie:
Wanneer
GROUP BY
aanwezig is, of er zijn geaggregeerde functies aanwezig, het is niet geldig voor deSELECT
lijstexpressies om naar niet-gegroepeerde kolommen te verwijzen, behalve binnen geaggregeerde functies of wanneer de niet-gegroepeerde kolom functioneel afhankelijk is van de gegroepeerde kolommen, aangezien er anders meer dan één mogelijke waarde zou zijn om te retourneren voor een niet-gegroepeerde kolom. Er is sprake van een functionele afhankelijkheid als de gegroepeerde kolommen (of een subset daarvan) de primaire sleutel zijn van de tabel die de niet-gegroepeerde kolom bevat.
Het is bekend dat een bepaald ander RDBMS hier vuile trucs uithaalt en dit toestaat en willekeurige waarden kiest...
Het lijkt erop dat u een lijst wilt van unieke patiënten die hebben gereageerd, met de laatste commentaar elk. De eenvoudigste manier in Postgres is met DISTINCT ON
:
SELECT DISTINCT ON (patient_id) *
FROM comments
WHERE clinician_id = $1
ORDER BY patient_id, created_at DESC NULLS LAST;
Maar dit zal niet vliegen met SQLite - wat om te beginnen niet in de lus zou moeten zitten:
- Generieke Ruby-oplossing voor SQLite3 "LIKE" of PostgreSQL "ILIKE"?
NULLS LAST
is alleen relevant als created_at
kan NULL zijn:
- PostgreSQL sorteren op datum/tijd asc, eerst null?
Details voor DISTINCT ON
:
- Selecteer de eerste rij in elke GROUP BY-groep?