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?