Você não pode combinar
SELECT *
com GROUP BY some_column
no Postgres (a menos que some_column
é o PK), porque isso é uma contradição. Todas as colunas não agregadas (usadas no SELECT
, HAVING
ou ORDER BY
cláusula fora de uma função agregada) deve estar no GROUP BY
list - onde a coluna de chave primária pode substituir todas as colunas de uma tabela. Caso contrário, é indefinido qual valor para escolher do conjunto agregado. Por documentação:
QuandoGROUP BY
está presente, ou qualquer função agregada está presente, não é válido para oSELECT
list expressões para se referir a colunas desagrupadas, exceto dentro de funções agregadas ou quando a coluna desagrupada for funcionalmente dependente das colunas agrupadas, pois, caso contrário, haveria mais de um valor possível a ser retornado para uma coluna desagrupada. Existe uma dependência funcional se as colunas agrupadas (ou um subconjunto delas) forem a chave primária da tabela que contém a coluna desagrupada.
Um certo outro RDBMS é conhecido por fazer truques sujos aqui e permitir isso e escolher valores arbitrários...
Você parece querer uma lista de pacientes únicos que comentaram, com o mais recente comente cada um. A maneira mais simples no Postgres é com
DISTINCT ON
:SELECT DISTINCT ON (patient_id) *
FROM comments
WHERE clinician_id = $1
ORDER BY patient_id, created_at DESC NULLS LAST;
Mas isso não funcionará com o SQLite - que não deve estar no loop para começar:
- Solução Ruby genérica para SQLite3 "LIKE" ou PostgreSQL "ILIKE"?
NULLS LAST
só é relevante se created_at
pode ser NULO:- PostgreSQL classifica por datetime asc, null primeiro?
Detalhes para
DISTINCT ON
:- Selecionar a primeira linha em cada grupo GROUP BY?