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 leSELECT
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 ?