PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

GroupingError:ERROR:a coluna deve aparecer na cláusula GROUP BY ou ser usada em uma função agregada


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:

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