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 BYestá presente, ou qualquer função agregada está presente, não é válido para oSELECTlist 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?