|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Nouveau Membre du Club
![]() Inscription : mai 2005 Messages : 64 ![]() |
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 :
La requete suivante passe à merveille : Code :
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, |
||||
|
|
00
|
|
|
#2 | ||
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
C'est en effet très simple
Code :
|
||
|
|
10
|
|
|
#3 |
|
Nouveau Membre du Club
![]() Inscription : mai 2005 Messages : 64 ![]() |
Merci pour cette réponse.
Je ne connaissais pas le IN couplé à la subquerie, c'est très malin ! J'avais essayé avec des where, mais on ne peut retourner qu'une valeur à la fois. Par contre je trouve cela très peu élégant, en fait surtout parceque mon cas réel est beeeaaaaauuucoup plus alambiqué que le simple cas que je présente, il y a des joins un peu partout, les conditions de jointures sont compliquées, etc. J'ai un peu le sentiment de taper deux fois la requete pour un résultat qui me parait tellement facile a récupérer ... si le moteur de bdd se rendait compte que dans le group by il n'a pas besoin de spécifier le champ value puisque la clause d'unicité lui interdit d'en avoir plusieurs ! Dans tous les cas, merci, maintenant au moins je récupère le résultat sans passer par le niveau applicatif. Si par contre quelqu'un sait pourquoi la clause d'unicité n'est pas explorée lors d'un group by qu'il n'hésite pas à me le dire, ou à m'expliquer ou je me trompe dans mon raisonnement. Bonne soirée, Guiz |
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : octobre 2008 Messages : 1 505 ![]() |
La contrainte d'unicité fait que le SGBD sait qu'à un couple (id,date) correspond une seule ligne de la table, mais pas que la même propriété est vraie pour un couple résultant d'un calcul: (id,max(date)).
|
|
|
00
|
|
|
#5 | ||||
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
Citation:
MySql est laxiste sur ce point (mais pas seulement pour des colonnes uniques) et peut être d'autre SGBD "à 2 balles", mais là dessus PostgreSQL est très normatif et renvoie une erreur indépendamment de la clause unique. Citation:
Si tu as une version récente de PostgreSQL, les fonctions analytiques (ou de fenêtrage) permette d'éviter les utilisations massives de GROUP BY + sous requête Par exemple ta requête de base pourraît s'écrire : Code :
|
||||
|
|
10
|
|
|
#6 | ||
|
Nouveau Membre du Club
![]() Inscription : mai 2005 Messages : 64 ![]() |
Citation:
Citation:
Merci pour les fonctions analytiques, je ne connaissais pas du tout ce concept, je vais pouvoir approfondir ce point et surement réaliser ce que je veux. Bonne soirée et merci encore a vous deux ! [edit :] et pour les CTE j'ai déjà regardé (sans savoir que ca s'appelait des CTE |
||
|
|
00
|
|
|
#7 | |||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
Citation:
Code :
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|||||
|
10
|
|
|
#8 |
|
Nouveau Membre du Club
![]() Inscription : mai 2005 Messages : 64 ![]() |
Excellent merci !
|
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Inscription : août 2008 Messages : 1 271 ![]() |
C'est vrai qu'en filtrant ça correspond mieux
merci d'avoir corrigé
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com