Не можете да комбинирате SELECT *
с GROUP BY some_column
в Postgres (освен ако some_column
е PK), защото това е противоречие. Всички неагрегирани колони (използвани в SELECT
, HAVING
или ORDER BY
клауза извън агрегатна функция) трябва да бъде в GROUP BY
списък - където колоната с първичен ключ може да замени всички колони на таблица. В противен случай не е дефинирано кое стойност, която да изберете от обобщения набор.
По документация:
Когато
GROUP BY
е налице или има агрегатни функции, не е валидно заSELECT
списъчни изрази, които да се отнасят до негрупирани колони, освен в рамките на агрегатни функции или когато негрупираната колона е функционално зависима от групираните колони, тъй като в противен случай би имало повече от една възможна стойност за връщане за негрупирана колона. Съществува функционална зависимост, ако групираните колони (или подмножество от тях) са първичният ключ на таблицата, съдържаща негрупираната колона.
Известно е, че някои други RDBMS играят мръсни номера тук и позволяват това и избират произволни стойности...
Изглежда искате списък с уникални пациенти, които са коментирали, с най-новите коментирайте всеки. Най-простият начин в Postgres е с DISTINCT ON
:
SELECT DISTINCT ON (patient_id) *
FROM comments
WHERE clinician_id = $1
ORDER BY patient_id, created_at DESC NULLS LAST;
Но това няма да върви със SQLite - което не трябва да е в цикъла за начало:
- Общо решение на Ruby за SQLite3 „LIKE“ или PostgreSQL „ILIKE“?
NULLS LAST
е подходящ само ако created_at
може да бъде NULL:
- PostgreSQL сортиране по datetime asc, първо нула?
Подробности за DISTINCT ON
:
- Изберете ли първия ред във всяка група GROUP BY?