Bonsoir à tous,

Je bute sur un problème qui me parait pourtant très simple mais rien à faire
Mes recherches se sont montrées totalement infructueuses.

Prenons un exemple fictif :

Une table composée de quatre colonnes :
id (cle primaire)
date (timestamp)
user_id (fk)
value (double)

Une relation d'unicité est définie entre les clés date et user_id, car à une meme date un utilisateur ne peut pas enregistrer deux valeurs.

Mon but est de récupérer la dernière valeur enregistrée pour chaque utilisateur. J'entends par dernière valeur enregistrée, celle qui maximise la colonne date, et non pas le plus gros id (rien n'est enregistré dans l'ordre chronologique).

Pour cela je pensais faire une requete du style :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT user_id, max(date), value
FROM table
GROUP BY user_id;
Le problème c'est que postgresql ne semble pas tenir compte de l'unicité déclarée entre user_id et date, donc il rale sur le fait que value n'est pas dans le GROUP BY.

La requete suivante passe à merveille :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
SELECT user_id, max(date)
FROM table
GROUP BY user_id;
Mais elle ne renvoie pas la valeur qui correspond à user_id et max(date).

Je ne comprends pas pourquoi, alors que le couple user_id et max(date) forme une clé unique qui me retourne à coup sur la valeur, je suis incapable en une seule requête de récupérer la valeur en question. J'ai tendance à accuser pgsql de ne pas comprendre que l'unicité entre le champ date et le champ user_id lui permet de récupérer le champ value sans ambiguité, mais je procède surement de la mauvaise façon.

J'ai tenté des trucs a base de subqueries, sans grand résultats.

Avez vous une idée du problème ? Et si c'est connu (ce que je n'ai pas reussi a mettre en évidence avec mes recherches), comment contourner ?

Je sèche complètement

Merci et bonne fin de journée,