Nie można połączyć SELECT * z GROUP BY some_column w Postgresie (chyba że some_column jest PK), bo to sprzeczność. Wszystkie niezagregowane kolumny (używane w SELECT , HAVING lub ORDER BY klauzula poza funkcją agregującą) musi znajdować się w GROUP BY list - gdzie kolumna klucza podstawowego może zastąpić wszystkie kolumny tabeli. W przeciwnym razie jest niezdefiniowane, które wartość do wybrania z zagregowanego zestawu.
Zgodnie z dokumentacją:
Kiedy GROUP BY jest obecny lub istnieją jakiekolwiek funkcje agregujące, nie jest prawidłowy dla SELECT listy wyrażeń odwołujących się do niezgrupowanych kolumn, z wyjątkiem funkcji agregujących lub sytuacji, gdy niezgrupowana kolumna jest funkcjonalnie zależna od zgrupowanych kolumn, ponieważ w przeciwnym razie dla niezgrupowanej kolumny mogłaby zostać zwrócona więcej niż jedna wartość. Zależność funkcjonalna istnieje, jeśli zgrupowane kolumny (lub ich podzbiór) są kluczem podstawowym tabeli zawierającej niezgrupowaną kolumnę.
Pewne inne RDBMS płatają tutaj brudne sztuczki i pozwalają na to i wybierają dowolne wartości...
Wygląda na to, że potrzebujesz listy unikalnych pacjentów, którzy skomentowali, z najnowszym skomentuj każdy. Najprostszym sposobem w Postgresie jest DISTINCT ON :
SELECT DISTINCT ON (patient_id) *
FROM comments
WHERE clinician_id = $1
ORDER BY patient_id, created_at DESC NULLS LAST;
Ale to nie zadziała z SQLite - co nie powinno być w pętli od początku:
- Ogólne rozwiązanie Ruby dla SQLite3 „LIKE” lub PostgreSQL „ILIKE”?
NULLS LAST ma znaczenie tylko wtedy, gdy created_at może być NULL:
- PostgreSQL sortuje według daty i godziny asc, najpierw null?
Szczegóły dla DISTINCT ON :
- Wybrać pierwszy wiersz w każdej grupie GROUP BY?