PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

GroupingError :ERREUR :la colonne doit apparaître dans la clause GROUP BY ou être utilisée dans une fonction d'agrégation

Vous ne pouvez pas combiner SELECT * avec GROUP BY some_column dans Postgres (sauf si some_column est le PK), parce que c'est une contradiction. Toutes les colonnes non agrégées (utilisées dans le SELECT , HAVING ou ORDER BY clause en dehors d'une fonction d'agrégation) doit être dans le GROUP BY list - où la colonne de clé primaire peut remplacer toutes les colonnes d'une table. Sinon, il n'est pas défini qui valeur à choisir dans l'ensemble agrégé.

Par documentation :

Lorsque GROUP BY est présent, ou si des fonctions d'agrégation sont présentes, il n'est pas valide pour le SELECT listes d'expressions pour faire référence à des colonnes non groupées, sauf dans les fonctions d'agrégation ou lorsque la colonne non groupée dépend fonctionnellement des colonnes groupées, car il y aurait autrement plus d'une valeur possible à renvoyer pour une colonne non groupée. Une dépendance fonctionnelle existe si les colonnes groupées (ou un sous-ensemble de celles-ci) sont la clé primaire de la table contenant la colonne non groupée.

Un certain autre RDBMS est connu pour jouer de sales tours ici et permettre cela et choisir des valeurs arbitraires...

Vous semblez vouloir une liste de patients uniques qui ont commenté, avec le dernier commentez chacun. Le moyen le plus simple dans Postgres est avec DISTINCT ON :

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

Mais cela ne fonctionnera pas avec SQLite - qui ne devrait pas être dans la boucle pour commencer :

  • Solution Ruby générique pour SQLite3 "LIKE" ou PostgreSQL "ILIKE" ?

NULLS LAST n'est pertinent que si created_at peut être NULL :

  • PostgreSQL trier par datetime asc, null en premier ?

Détails pour DISTINCT ON :

  • Sélectionner la première ligne de chaque groupe GROUP BY ?