Avoir le max d'un resultat sql

Fermé
blacksadangel Messages postés 21 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 7 août 2014 - 2 juil. 2012 à 16:20
 Utilisateur anonyme - 9 juil. 2012 à 20:27
Bonjour tout lmonde
sous Mysql,j'ai réalisé la requête suivante qui permet d'avoir la somme de consommation de chaque utilisateur

SELECT clid, sum( duration )
FROM cdr
GROUP BY clid

ca me donne :

clid sum( duration )
"user1" <100> 30
"user2" <101> 709
"user3" <200> 2877
"user4" <106> 10769
"user5" <107> 3104

en fait,j'ai besoin de la requête sql qui permet d'avoir le max du résultat précendante (qui sera bien sur le "user4")

Merci infiniment pour votre aide
:)

4 réponses

Utilisateur anonyme
2 juil. 2012 à 17:04
Bonjour

J'ai une solution pas jolie-jolie, mais qui devrait marcher :

SELECT t2.clid, t2.dduration FROM (SELECT clid, sum(duration ) dduration FROM cdr GROUP BY clid) t2 WHERE t2.dduration = (select MAX(dduration ) from (SELECT clid, sum(duration ) dduration FROM cdr GROUP BY clid) t)
0
blacksadangel Messages postés 21 Date d'inscription vendredi 29 mai 2009 Statut Membre Dernière intervention 7 août 2014
2 juil. 2012 à 18:36
ça bien marché !! merci infiniment le père :)
0
SELECT clid, sum( duration ) AS sum_duration
FROM cdr
GROUP BY clid
ORDER BY sum_duration DESC
LIMIT 1
0
Utilisateur anonyme
4 juil. 2012 à 07:48
Si on ne s'intéresse qu'à sum_duration, ok
Mais si on s'intéresse aussi à clid, on ne voit pas les ex aequo avec ta requête
0
En effet.
Soit :)

SELECT GROUP_CONCAT( clid ) AS clids, max_sum_duration FROM (
SELECT
clid, sum( duration ) AS max_sum_duration
FROM cdr
GROUP BY clid
)
GROUP BY max_sum_duration
ORDER BY max_sum_duration DESC
LIMIT 1

=> Les clid seront dans clids, séparés par des virgules
0
Utilisateur anonyme
4 juil. 2012 à 11:20
Histoire de chipoter... ^^
Mysql se plaint d'un manque d'alias. Ajouter un nom bidon après '...GROUP BY clid)'
En général, on préfère avoir les différents résultats dans des lignes séparées. Et si un des clid s'écrit avec une virgule ?
0
Histoire de chipoter :p On change le séparateur !
GROUP_CONCAT( clid SEPARATOR ';' ) AS clids
:p

Il y aurait bien un SQL pour avoir un clid par ligne, mais je vais cesser là la surenchère ;)
0
Utilisateur anonyme
4 juil. 2012 à 13:50
@A.Nonymous
Changer de séparateur ne change rien, et s'il y a un point virgule dans le clid ?
Pour ce qui est d'avoir un clid par ligne, la requête que j'ai donnée au début convient, mais je la trouve lourde, il doit y avoir plus simple. Mais je n'y connais pas grand chose en langage sql.
0
malaik5 Messages postés 258 Date d'inscription vendredi 20 novembre 2009 Statut Membre Dernière intervention 28 novembre 2013 33
Modifié par malaik5 le 9/07/2012 à 17:37
Bonjour,
@Le père, dans ta solution il y a des trucs redondons,

je pense que ça, ça peut marcher sans compliquer :
(j'ai testé la solution), parce que cette solution te permet de gagner en jointure ce qui est consommateur en cpu pour l'exécution de la requete

SELECT t2.clid, max(t2.dduration) FROM (SELECT clid, sum(duration ) dduration
FROM client GROUP BY clid) t2

Bon courage
0
Utilisateur anonyme
9 juil. 2012 à 20:27
Je me doute bien que ma requête est redondante ; j'ai d'ailleurs bien dit qu'elle n'était pas jolie-jolie.
Mais la tienne présente deux inconvénients :
Elle ne donne qu'une seule ligne de résultats, même s'il y a des ex-aequo
Le t2.clid N'EST PAS sauf hasard heureux, celui associé à max(t2.dduration)
En fait, le t2.clid sorti semble être simplement le premier de la table, même si le max est correct, lui.
0