IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

clause HAVING et MAX avec un GROUP BY


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 64
    Par défaut clause HAVING et MAX avec un GROUP BY
    Rien a faire ça rentre pas, je ne comprends pas comment on utilise cette fonction MAX
    Je veux sur un GROUP BY récupérer la ligne de valeur maximale sur ce sous groupe, donc j'écris la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT count(*), `NomAeroDep`,`NomAeroArr`, `HDepChemin`, `HArrChemin`,`CodeAeroDep`, `CodeAeroArr` 
    FROM `Chemins_HDepMin_1610` c
    group by c.`CodeAeroDep`, c.`CodeAeroArr`
    having max(time_to_sec(c.`HDepChemin`))
    voilà je veux le départ le plus tardif pour chaque couple origine-destination.
    Et badaboum, rien n'y fait il me renvoie une ligne unique pour chaque O-D mais jamais celle de plus haute valeur de HdepChemin

    Je m'arrache les cheveux.
    Help please

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    d'après ce que tu dis, pas besoin de HAVING... tu veux le MAX, tu demandes le MAX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `NomAeroDep`,`NomAeroArr`, MAX(`HDepChemin`), MAX(`HArrChemin`),`CodeAeroDep`, `CodeAeroArr` 
    FROM `Chemins_HDepMin_1610` c
    GROUP BY c.`CodeAeroDep`, c.`CodeAeroArr`
    EDIT : Kris, t'es grillé !

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 64
    Par défaut
    Citation Envoyé par Antoun Voir le message
    d'après ce que tu dis, pas besoin de HAVING... tu veux le MAX, tu demandes le MAX :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `NomAeroDep`,`NomAeroArr`, MAX(`HDepChemin`), MAX(`HArrChemin`),`CodeAeroDep`, `CodeAeroArr` 
    FROM `Chemins_HDepMin_1610` c
    GROUP BY c.`CodeAeroDep`, c.`CodeAeroArr`
    ben oui Antoun, mais là je vais sortir les valeurs maximales sur deux colonnes, ce n'est pas ce que je veux, je veux la ligne contenant la valeur maximale sur une colonne, c'est à dire le trajet complet DONT l'heure de départ est maximale. Avec ce que tu propose je ais avoir l'heure max de départ et aussi une heure max d'arrivée qui pourra correspondre à une autre ligne.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par EnRadeSurEclipse Voir le message
    Avec ce que tu propose je ais avoir l'heure max de départ et aussi une heure max d'arrivée qui pourra correspondre à une autre ligne.
    Yep... tu ne parlais que de l'heure de départ et je ne savais pas quoi faire de l'autre... Maintenant, je crois comprendre que ce que tu veux ce sont les détails du dernier vol à partir. Cela demande une sous-requête, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT `NomAeroDep`,`NomAeroArr`, `HDepChemin`,   
      `HArrChemin`,`CodeAeroDep`, `CodeAeroArr` 
    FROM `Chemins_HDepMin_1610` c
    WHERE HDepChemin = (SELECT MAX(HDepChemin) FROM Chemins_HDepMin_1610 c2)

  5. #5
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 64
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Yep... tu ne parlais que de l'heure de départ et je ne savais pas quoi faire de l'autre... Maintenant, je crois comprendre que ce que tu veux ce sont les détails du dernier vol à partir. Cela demande une sous-requête, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT `NomAeroDep`,`NomAeroArr`, `HDepChemin`,   
      `HArrChemin`,`CodeAeroDep`, `CodeAeroArr` 
    FROM `Chemins_HDepMin_1610` c
    WHERE HDepChemin = (SELECT MAX(HDepChemin) FROM Chemins_HDepMin_1610 c2)
    drôle comme il est ardu d'expliquer simplement ma requête.
    Ce que tu propose ici c'est de trouver le départ le plus tardif de toute ma table; moi je veux le départ le plus tardif de chaque couple origine-destination. Ce que je veux c'est supprimer des "presque" doublons d'OD, et à chaque fois n'en retenir qu'un, le plus tardif.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par EnRadeSurEclipse Voir le message
    drôle comme il est ardu d'expliquer simplement ma requête.
    oui. Une fois que tu as exprimé précisément ton besoin, tu as déjà 3/4 de ta requête.
    Citation Envoyé par EnRadeSurEclipse Voir le message
    Ce que tu propose ici c'est de trouver le départ le plus tardif de toute ma table; moi je veux le départ le plus tardif de chaque couple origine-destination. Ce que je veux c'est supprimer des "presque" doublons d'OD, et à chaque fois n'en retenir qu'un, le plus tardif.
    OK :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    SELECT `NomAeroDep`,`NomAeroArr`, `HDepChemin`,   
      `HArrChemin`,`CodeAeroDep`, `CodeAeroArr` 
    FROM `Chemins_HDepMin_1610` c
    WHERE HDepChemin = (SELECT MAX(HDepChemin) 
      FROM Chemins_HDepMin_1610 c2
      WHERE c2.CodeAeroDep = c.CodeAeroDep AND c2.CodeAeroArr = c.CodeAeroArr
      )
     
    -- ou encore :
     
    SELECT c.NomAeroDep, c.NomAeroArr, c.HDepChemin,   
      c.HArrChemin,c.CodeAeroDep, c.CodeAeroArr
    FROM Chemins_HDepMin_1610 c
      INNER JOIN (
        SELECT CodeAeroDep, CodeAeroArr, MAX(HDepChemin) AS DernierDep
        FROM Chemins_HDepMin_1610
        GROUP BY CodeAeroDep, CodeAeroArr
      ) c2 ON c.CodeAeroDep = c2.CodeAeroDep AND c.CodeAeroArr = c2.CodeAeroArr AND c.HDepChemin = c2.DernierDep

  7. #7
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Je ne suis vraiment pas sûr de la pertinence de la projection en fonction du GROUP BY.
    Par contre HAVING max(time_to_sec(c.`HDepChemin`)) sera toujours vrai et n'a donc pas de sens.
    Il faut comparer max(time_to_sec(c.`HDepChemin`)) avec une colonne dans la clause HAVING.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  8. #8
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    64
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 64
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    Saluton,
    Je ne suis vraiment pas sûr de la pertinence de la projection en fonction du GROUP BY.
    Par contre HAVING max(time_to_sec(c.`HDepChemin`)) sera toujours vrai et n'a donc pas de sens.
    Il faut comparer max(time_to_sec(c.`HDepChemin`)) avec une colonne dans la clause HAVING.
    c'est pas totalement limpide pour moi ta réponse: j'ai tenté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c.`HDepChemin`=max(time_to_sec(c.`HDepChemin`))
    et là il me sort que dalle. alors qu'avant il me sortait une liste, débile certes, mais une liste quand même.
    Je vois pas du tout pourquoi tu dis que le HAVING max(time_to_sec(c.`HDepChemin`)) sera tuojours vrai.
    Ma compréhension est que le HAVING agit à l'intérieur du GROUP BY, enfin c'est ce que j'aimerais qu'il fit.

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/06/2014, 17h11
  2. [NHibernate] clause having avec criteria
    Par MacReiben dans le forum NHibernate
    Réponses: 0
    Dernier message: 05/01/2012, 10h11
  3. clause MAX() dans un GROUP BY
    Par zephilou dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/01/2008, 11h26
  4. max(count(*)) avec un GROUP BY (suite)
    Par awalter1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/09/2007, 15h07
  5. max(count(*)) avec un GROUP BY
    Par awalter1 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/09/2007, 11h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo