sql >> Base de Datos >  >> RDS >> PostgreSQL

GroupingError:ERROR:la columna debe aparecer en la cláusula GROUP BY o usarse en una función agregada

No puede combinar SELECT * con GROUP BY some_column en Postgres (a menos que some_column es el PK), porque eso es una contradicción. Todas las columnas no agregadas (utilizadas en SELECT , HAVING o ORDER BY cláusula fuera de una función agregada) debe estar en el GROUP BY lista:donde la columna de clave principal puede reemplazar todas las columnas de una tabla. De lo contrario, no está definido cuál valor para elegir del conjunto agregado.

Por documentación:

Cuando GROUP BY está presente, o cualquier función agregada está presente, no es válido para SELECT Expresiones de lista para hacer referencia a columnas no agrupadas excepto dentro de funciones agregadas o cuando la columna no agrupada dependa funcionalmente de las columnas agrupadas, ya que de lo contrario habría más de un valor posible para devolver para una columna no agrupada. Existe una dependencia funcional si las columnas agrupadas (o un subconjunto de las mismas) son la clave principal de la tabla que contiene la columna no agrupada.

Se sabe que otro RDBMS juega trucos sucios aquí y permite esto y elige valores arbitrarios...

Parece que desea una lista de pacientes únicos que han comentado, con los últimos comenta cada uno. La forma más sencilla en Postgres es con DISTINCT ON :

SELECT DISTINCT ON (patient_id) *
FROM   comments
WHERE  clinician_id = $1
ORDER  BY patient_id, created_at DESC NULLS LAST;

Pero esto no funcionará con SQLite, que no debería estar en el bucle para empezar:

  • ¿Solución Ruby genérica para SQLite3 "LIKE" o PostgreSQL "ILIKE"?

NULLS LAST solo es relevante si created_at puede ser NULL:

  • Ordenar PostgreSQL por fechahora asc, ¿null primero?

Detalles para DISTINCT ON :

  • ¿Seleccionar la primera fila en cada grupo GROUP BY?