Prendre les enregistrements valeur max par catégorie (GROUP BY) [SQL] - SQL/NoSQL - Programmation
Marsh Posté le 06-08-2006 à 17:44:09
select nom,cat,max(val) as val from ta_table group by cat
Marsh Posté le 06-08-2006 à 17:59:15
SELECT nom,cat,val FROM tatable GROUP BY cat HAVING MAX(val)=val ?
Marsh Posté le 07-08-2006 à 12:23:48
Merci pour ces deux réponses
satirik > Non ça me prend bien le maximum dans la catégorie, mais pas le nom correspondant à ce maximum
je@nb > Bizarre, la requête ne m'affiche pas toutes les catégories mais seulement quelques-unes ! je n'arrive pas à savoir le critère qui les fait s'afficher ou pas...
je continue à chercher !
Marsh Posté le 07-08-2006 à 12:41:06
ceyquem, si tu es sûr que pour une cat donnée tu as un et un seul nom, alors tu peux tenter cette requête. Cependant, il existe d'autres manières bien plus propres et plus rapides, selon le SGBD.
SELECT Max(nom) AS nom, cat, Max(val) AS val |
Je ne te la conseille pas vraiment, mais bon...
Tu peux sinon faire comme ceci qui est plus académique mais moins performant,
SELECT t1.nom, t1.cat, t2.val |
Marsh Posté le 07-08-2006 à 18:24:10
j'arrive pas trop à corriger les erreurs de la jointure
pour l'autre requête, il semble que ça marche mais là je suis perplexe sur le MAX(nom) !
Merci pour ton aide
Marsh Posté le 07-08-2006 à 18:29:06
correction : la requête bizarre avec Max(nom) ne marche pas, je n'ai pas un seul nom par catégorie !
Marsh Posté le 07-08-2006 à 18:31:30
Un exemple peut-être plus parlant pour illustrer ce que je veux faire :
- une liste d'élèves, leur classe et leur moyenne générale (nom, classe, moyenne)
je veux sortir pour chaque classe l'élève qui a la meilleure moyenne (si y'a des égalités, pas grave, on en prend un des deux comme on veur).
Marsh Posté le 07-08-2006 à 18:34:17
Tu peux fournir un set d'exemple ? un .sql ou un copier/collé ici ?
Marsh Posté le 07-08-2006 à 18:41:02
sur la table suivante :
loic ce1 14 |
je veux récupérer :
julie ce1 19 |
ou bien :
gero ce1 19 |
(car égalité entre gero et julie)
Marsh Posté le 07-08-2006 à 18:44:35
SELECT t1.nom, t1.cat, t2.val |
Il manquait une condition dans la seconde requête postée.
Sinon, tu peux également faire comme suit.
SELECT t1.nom, t1.cat, t1.val |
Marsh Posté le 07-08-2006 à 19:32:44
waw c'est vrai que c'est lourd en traitement (3.4 s pour 400 enregistrements) !
Marsh Posté le 07-08-2006 à 19:49:55
mySQL.
J'essaie d'autres requêtes mais ça passe pas. Exemple :
SELECT A.nom, A.note, A.classe, MAX(B.note) AS maxnote, B.classe FROM eleves A, eleves B WHERE A.note=maxnote AND A.classe = B.classe GROUP BY A.nom, A.note, A.classe ORDER BY A.classe ASC; |
Marsh Posté le 14-08-2006 à 10:40:03
je comprend pas le souci
Code :
|
doit marcher pour ce que tu veux faire
Marsh Posté le 16-08-2006 à 18:00:20
il me faut le nom de l'élève et pas seulement sa classe (erreur dans ma requête SQL plus haut), et la requête que tu me proposes ne permet pas de récupérer le nom de l'élève qui a eu la meilleure note...
Marsh Posté le 17-08-2006 à 15:56:08
|
Marsh Posté le 03-02-2014 à 12:04:13
merci pour ton aide Arjuna
Marsh Posté le 03-02-2014 à 15:50:00
IL Y A AUSSI UN AUTRE SOLUTION CA MARCHE BIEN.
Exemple de table livre :
id categorie date livre pages
1 | 10 | 04/03/2009 | livre A | 399
2 | 11 | 04/03/2009 | livre B | 244
5 | 12 | 04/03/2009 | livre C | 555
3 | 10 | 03/03/2009 | livre D | 300
4 | 11 | 03/03/2009 | livre E | 200
6 | 12 | 03/03/2009 | livre F | 500
1 | 10 | 04/03/2009 | livre A | 399
2 | 11 | 04/03/2009 | livre B | 244
5 | 12 | 04/03/2009 | livre C | 555
On souhaite récupérer le livre ayant la date la plus récente par catégorie pour obtenir le résultat suivant :
id categorie date livre pages
1 | 10 | 04/03/2009 | livre A | 399
2 | 11 | 04/03/2009 | livre B | 244
5 | 12 | 04/03/2009 | livre C | 555
SELECT l.*
FROM livre l
INNER JOIN
(
SELECT categorie, MAX(date) AS maxDate
FROM livre
GROUP BY categorie
) groupel ON l.categorie = groupel.categorie AND l.date = groupel.maxDate
Marsh Posté le 06-08-2006 à 16:01:46
Bonjour,
J'ai une liste d'enregistrements classés par catégorie (champ "cat" ).
J'ai pour chaque enregistrement un champ valeur (champ "val" ) et un champ nom (champ "nom" )
Exemple :
nom cat val
foo cat1 10
bar cat2 05
ter cat1 07
pot cat2 08
Je souhaite sélectionner les enregistrement qui on la valeur "val" maximale dans leur catégorie "cat".
Exemple :
nom cat val
foo cat1 10
pot cat2 08
Je suppose qu'il s'agit GROUP BY rusé mais je ne parviens pas à ce que je veux
Des idées ?
Merci !