Avoir le max d'un resultat sql

blacksadangel Messages postés 21 Date d'inscription   Statut Membre Dernière intervention   -  
 Utilisateur anonyme -
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
:)
A voir également:

4 réponses

Utilisateur anonyme
 
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   Statut Membre Dernière intervention  
 
ça bien marché !! merci infiniment le père :)
0
A.Nonymous
 
SELECT clid, sum( duration ) AS sum_duration
FROM cdr
GROUP BY clid
ORDER BY sum_duration DESC
LIMIT 1
0
Utilisateur anonyme
 
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
A.Nonymous
 
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
 
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
A.Nonymous
 
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
 
@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   Statut Membre Dernière intervention   33
 
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
 
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