Avoir le max d'un resultat sql

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

  • Votes
  • Date
  • Date décroissante
  1. 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)
    
    1. SELECT clid, sum( duration ) AS sum_duration
      FROM cdr
      GROUP BY clid
      ORDER BY sum_duration DESC
      LIMIT 1
      1. 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
      2. 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
      3. 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 ?
      4. 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 ;)
      5. @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.
    2. 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
      1. 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.