Du kan inte kombinera SELECT *
med GROUP BY some_column
i Postgres (om inte some_column
är PK), eftersom det är en motsägelse. Alla icke aggregerade kolumner (används i SELECT
, HAVING
eller ORDER BY
sats utanför en aggregatfunktion) måste finnas i GROUP BY
lista - där primärnyckelkolumnen kan ersätta alla kolumner i en tabell. Annars är det odefinierat vilket värde att välja från den aggregerade uppsättningen.
Per dokumentation:
När
GROUP BY
är närvarande, eller några aggregerade funktioner är närvarande, är det inte giltigt förSELECT
listuttryck för att hänvisa till ogrupperade kolumner förutom inom aggregerade funktioner eller när den ogrupperade kolumnen är funktionellt beroende av de grupperade kolumnerna, eftersom det annars skulle finnas mer än ett möjligt värde att returnera för en ogrupperad kolumn. Ett funktionellt beroende existerar om de grupperade kolumnerna (eller en delmängd därav) är den primära nyckeln i tabellen som innehåller den ogrupperade kolumnen.
En viss annan RDBMS är känd för att spela smutsiga trick här och tillåta detta och välja godtyckliga värden...
Du verkar vilja ha en lista över unika patienter som har kommenterat, med det senaste kommentera var och en. Det enklaste sättet i Postgres är med DISTINCT ON
:
SELECT DISTINCT ON (patient_id) *
FROM comments
WHERE clinician_id = $1
ORDER BY patient_id, created_at DESC NULLS LAST;
Men detta kommer inte att flyga med SQLite - som inte borde vara i slingan till att börja med:
- Generisk Ruby-lösning för SQLite3 "LIKE" eller PostgreSQL "ILKE"?
NULLS LAST
är endast relevant om created_at
kan vara NULL:
- PostgreSQL sortera efter datetime asc, null först?
Detaljer för DISTINCT ON
:
- Välj första raden i varje GROUP BY-grupp?