Avoir le max d'un resultat sql

blacksadangel Messages postés 39 Statut Membre -  
 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
:)

4 réponses

  1. 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
  2. blacksadangel Messages postés 39 Statut Membre
     
    ça bien marché !! merci infiniment le père :)
    0
  3. A.Nonymous
     
    SELECT clid, sum( duration ) AS sum_duration
    FROM cdr
    GROUP BY clid
    ORDER BY sum_duration DESC
    LIMIT 1
    0
    1. 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
    2. 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
    3. 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
    4. 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
    5. 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
  4. malaik5 Messages postés 259 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
    1. 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