Requete en fonction du max

Résolu/Fermé
lefadrine Messages postés 28 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 20 avril 2010 - 11 sept. 2009 à 19:43
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 - 14 sept. 2009 à 23:40
Bonjour,
voilà mon problème : j'aimerais récupérer les tuples de cette table en fonction du max de la valeur pour chaque code concerné. Comme un exemple vaut mieux qu'un bon discours !

id       code         valeur
----------------------------
1         545           18
2         545           18
3         545           22
4         545           22
5         600            3
6         600           13
7         700           69
8         700           13

Je souhaiterais obtenir comme résultat les tuples suivants :
id         code        valeur
-----------------------------
3         545             22
4         545             22
6         600             13
7         700             69

J'ai essayé avec la requête suivante :
SELECT * FROM table WHERE valeur IN (SELECT MAX(valeur) FROM table GROUP BY code)
Mais le problème est que j'obtiens le tuple "700-13" en plus, en effet la requete prend en compte tous les max pour chaque code, et comme 13 est un max déjà pour le code 600, je me retrouve donc avec le couple "700 - 13" en plus.
Je ne vois vraiment pas comment faire...
Merci d'avance pour vos réponses.
A voir également:

20 réponses

P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
12 sept. 2009 à 10:03
1
lefadrine Messages postés 28 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 20 avril 2010 11
12 sept. 2009 à 13:59
merci beaucoup c'est exactement ça. La requête est donc :
SELECT *
FROM   table T1
WHERE  valeur=(SELECT MAX(T2.valeur)
              FROM table T2
              WHERE T1.code = T2.code);
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
11 sept. 2009 à 20:09
salut essai un distinct devant max mais je ni crois pas tro la synthax devrais passer mais pas sur pour le resultat
0
lefadrine Messages postés 28 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 20 avril 2010 11
12 sept. 2009 à 03:24
Merci bien mais non, en fait le distinct ne sert à rien ici. Le group by dans la 2eme requete élimine déjà les tuples redondants, car par définition il les regroupe en fonction du max de la valeur...

Pour répondre à ce problème, je pense qu'il faut apporter du sang neuf, càd voir la requete sous une autre forme, laquelle je n'arrive toujours pas à définir !
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
12 sept. 2009 à 14:29
c pas tres clair si tu avais la solution et l expliquer cela serai mieu je pense

merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
12 sept. 2009 à 14:35
a quoi correpond le T1 et T2 merci
0
lefadrine Messages postés 28 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 20 avril 2010 11
12 sept. 2009 à 17:08
T1 et T2 sont des déclarations de l'objet "table". Des variables si tu préfères, qui représente la table "table".

Ici l'astuce consiste à utiliser deux "table" pour pouvoir récupérer les bonnes infos en faisant une jointure sur code entre les deux pour obtenir les bons max par code.
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
12 sept. 2009 à 17:42
ah ok merci ce sont des nom fictif pour pouvoir les comparer ds cette meme requete dc ok merci
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
12 sept. 2009 à 17:46
Par contre moi j ai un souci avec la requete car j ai 2 valeur max identique pour la meme personne mais il me renvoi les 2 resultat voici ma requete tirer de la votre
SELECT *
FROM new T1
WHERE num=(SELECT MAX(T2.num)
FROM new T2
WHERE T1.nom = T2.nom);
merci
0
lefadrine Messages postés 28 Date d'inscription vendredi 17 avril 2009 Statut Membre Dernière intervention 20 avril 2010 11
13 sept. 2009 à 20:07
oui c'est normal c'est le but recherché pour cette requête, regarde mon premier post, plus particulièrement les résultats attendus à partir de ma table de départ.
j'obtiens 2 fois le tuple "545 -22", et c'est ce que je souhaite.
A mon avis cette requête ne correspond pas à ce que tu souhaites obtenir. Donne nous un exemple pour t'aider...
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
14 sept. 2009 à 19:42
voici ma requete

SELECT *
FROM new
WHERE num in( SELECT MAX(num) FROM new GROUP BY nom);

si g 2 meme valeur pour num il me renvoi les 2 enregistrement peut etre normal
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
14 sept. 2009 à 19:48
Ajoute un group by sur num sur ton select (pas celui contenu dans le not in).
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
14 sept. 2009 à 19:56
c a dire je ne vois pas ce que tu veux dire
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
14 sept. 2009 à 20:15
re

ca ne marche pas meme resultat
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
14 sept. 2009 à 20:49
Cela fonctionne très bien.

mysql> CREATE TABLE new (num INT, nom VARCHAR(20));
Query OK, 0 rows affected (0.07 sec)

mysql> INSERT INTO new VALUES(10, '10-a'), (20, '20-a'), (10, '10-b'), (30, '30-a');
Query OK, 4 rows affected (0.01 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT N1.num, N1.nom FROM new N1 WHERE N1.num IN (SELECT MAX(N2.num) FROM new N2 GROUP BY N2.NUM);
+------+------+
| num  | nom  |
+------+------+
|   10 | 10-a | 
|   20 | 20-a | 
|   10 | 10-b | 
|   30 | 30-a | 
+------+------+
4 rows in set (0.01 sec)

mysql> SELECT N1.num, N1.nom FROM new N1 WHERE N1.num IN (SELECT MAX(N2.num) FROM new N2 GROUP BY N2.NUM) GROUP BY N1.num;
+------+------+
| num  | nom  |
+------+------+
|   10 | 10-a | 
|   20 | 20-a | 
|   30 | 30-a | 
+------+------+
3 rows in set (0.00 sec)
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
14 sept. 2009 à 21:04
voici ma requete

SELECT N1.num,N1.nom
FROM new AS N1

WHERE (((N1.num) In (SELECT MAX(N2.num) FROM new N2 GROUP BY N2.NUM)))
GROUP BY N1.num;


probleme il me dit que 'nom' ne fait pas partti de la fonction d'agregat
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
14 sept. 2009 à 21:10
C'est normal, la colonne nom n'était valable que pour l'exemple que je t'ai montré, je doute que tu ais une colonne portant ce nom.

A toi de remplacer par tes propres noms de colonnes.
Sinon, évite aussi les parenthèses superflues qui ne sont que source d'erreurs.
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
14 sept. 2009 à 21:11
bah si mon champ s appel nom

c le group by de la fin qui pose probleme il n en veu pas
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
14 sept. 2009 à 21:55
Montre le message d'erreur stp.
0
moiced59 Messages postés 1145 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 18 août 2014 60
14 sept. 2009 à 22:07
alors:

vous avez essayé d'executer une requete ne comprenant pas l'expression specifié 'nom' com une partie de la fonction d'agregat


voila
0
P@t@ch0n Messages postés 565 Date d'inscription mercredi 15 avril 2009 Statut Membre Dernière intervention 28 décembre 2009 85
14 sept. 2009 à 23:40
Tout ce que je vois d'incorrect dans ta requête, c'est que tu as mit N2.NUM au lieu de N2.num
0