Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/04/2008, 15h16   #1
Invité régulier
 
Inscription : février 2005
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12
Points : 6
Points : 6
Par défaut Requête avec maximum

Bonjour tout le monde,

Je sèche un peu pour écrire ma requête : voilà, j'ai une table avec les colonnes a,b,c,d,... . Je voudrais rechercher les lignes où, pour une valeur donnée dans a, et une valeur données dans b, c est maximum, et ce bien sûr pour toutes les valeurs de a et b.

Pour expliquer un peu plus, a et b identifient des personnes et des formulaires, et c un niveau d'itération. Par exemple, la premiere fois que la personne a0 remplie le formulaire b0, c vaut 1, mais pour la deuxième fois, les réponse sont enregistrées avec c=2. Je voudrais ne garder que les derniers essais.

J'ai essayer de jouer avec la fonction max(), mais je n'obtiens pas vraiment ce que je veux. Merci de votre aide !

Alexis

ps : j'utilise postgresql 8.2
alexis_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 15h40   #2
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 485
Points : 1 485
Je ne suis pas sûr d'avoir compris, mais si pour chaque couple (a,b) distinct, tu cherche le max de c, la requête est :
Code :
SELECT a,b,max(c) FROM TABLE GROUP BY a,b
Si tu veux en plus les autres colonnes (d,e, ...) correspondant au max(c), il faut faire une sous-requête
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne.
La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 15h46   #3
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
bonjour,
je suis pas sur de comprendre, mais as tu essayer une requete du genre :
SELECT a,b,max(c) FROM matable GROUP BY a,b

?
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 15h47   #4
Membre émérite
 
Avatar de hpalpha
 
Inscription : mars 2002
Messages : 770
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 770
Points : 833
Points : 833
oups, j'ai répondu un peu tardivement scheu
hpalpha est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2008, 16h01   #5
Invité régulier
 
Inscription : février 2005
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12
Points : 6
Points : 6
Merci,

J'étais arrivé à ce genre de requête, mais ça ne fait pas totalement ce que je veux. Je n'ai peut-être pas été clair : pour chaque couple (a,b), il y a plusieurs valeurs de c, et à chaque fois plusieurs valeurs des autres colonnes ( d,e,... )
Ce que je voudrais, c'est récupérer toutes les colonnes, pour le maximum de c pour chaque couple a,b.

Pour résumé : SELECT * FROM TABLE WHERE ( c est un maximum pour le couple (a,b) )

Peut-être que cela correspond à une sous-requête, comme tu le suggères, scheu, mais je ne vois toujours pas très bien comment.

Alexis
alexis_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/04/2008, 00h59   #6
Membre éclairé
 
Avatar de icer
 
Inscription : janvier 2006
Messages : 332
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 332
Points : 308
Points : 308
Bonjour,

Citation:
SELECT * FROM TABLE WHERE ( c est un maximum pour le couple (a,b) )
Essayes ça :
Code :
1
2
3
4
5
SELECT * 
FROM TABLE t1, (SELECT a, b, max(c) FROM TABLE GROUP BY a,b) t2  
WHERE  t1.a = t2.a 
     AND t1.b = t2.b
     AND t1.c = t2.c
icer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2008, 09h51   #7
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 485
Points : 1 485
Citation:
Envoyé par icer Voir le message
Bonjour,



Essayes ça :
Code :
1
2
3
4
5
SELECT * 
FROM TABLE t1, (SELECT a, b, max(c) FROM TABLE GROUP BY a,b) t2  
WHERE  t1.a = t2.a 
     AND t1.b = t2.b
     AND t1.c = t2.c
Il faut effectivement passer par une sous-requête. Pour la syntaxe, il manquerait peut-être quelques "as" (à vérifier) :

Code :
1
2
3
4
5
SELECT * 
FROM TABLE as t1, (SELECT a, b, max(c) as c FROM TABLE GROUP BY a,b) as t2  
WHERE  t1.a = t2.a 
     AND t1.b = t2.b
     AND t1.c = t2.c
__________________
La théorie, c'est quand on sait tout mais que rien ne fonctionne.
La pratique, c'est quand tout fonctionne mais que personne ne sait pourquoi.
Ici, nous avons réuni théorie et pratique : Rien ne fonctionne ... et personne ne sait pourquoi !

Réplication de base avec Postgresql : http://scheu.developpez.com/tutoriel.../log-shipping/
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2008, 13h32   #8
Membre éclairé
 
Avatar de icer
 
Inscription : janvier 2006
Messages : 332
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 332
Points : 308
Points : 308
... est essentiel pour retourner les résultats voulus. Ne pas le mettre est une erreur. Les autres "as" sont optionnels.
icer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2008, 10h50   #9
Invité régulier
 
Inscription : février 2005
Messages : 12
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12
Points : 6
Points : 6
Merci beaucoup, avec ça j'ai de qu'il me faut

A.
alexis_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h44.


 
 
 
 
Partenaires

Hébergement Web