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

Langage SQL Discussion :

GroupBY, Having et fonction MAX


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 13
    Points
    13
    Par défaut GroupBY, Having et fonction MAX
    Bonjour,
    je crois bien avoir un petit problème d'aggrégation. Je souhaite obtenir seulement la ligne en rouge comme résultat et après plusieurs tentative, je trouve pas le moyen d'effectuer correctement mon aggrégation. Un âme charitable pourrait-il m'aider?

    Merci!


    ------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
         HOLE_NUMBER,
         MAX (gtp) as eGT,
         Length
    FROM 
         DEF_PROBE_RESULTS
     
    where HOLE_NUMBER = 'MT-07-113'
     
    GROUP BY 
        HOLE_NUMBER,
        Length
    ------------------------------------------
    résultat:
    HOLE_NUMBER , eGT, Length
    MT-07-113, 0.120000, 0.03,
    MT-07-113, 0.002537, 0.10,
    MT-07-113, 0.004382, 0.20
    MT-07-113, 0.220000, 0.21,
    MT-07-113, 0.010000, 0.41,
    MT-07-113, 0.110000, 0.87,

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Si j'ai bien compris ce que tu cherches :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
         HOLE_NUMBER,
         gtp as eGT,
         Length
    FROM  DEF_PROBE_RESULTS
    WHERE HOLE_NUMBER = 'MT-07-113'
    AND gtp = (SELECT MAX(gtp) FROM DEF_PROBE_RESULTS
                     where HOLE_NUMBER = 'MT-07-113')
    Roland

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    humm c'est pas tout à fait ce que je recherche, je crois que j'ai omis de dire certains détails dans mon énoncé précédent, je m'en excuse ...ok j'essaie d'élaborer d'avantage.

    J'ai une liste d'élément que je dois sélectionnner selon le maximum de deux colonnes situé dans deux tables différentes..

    voici mon ébauche ainsi que le résultat obtenu. Les ligne en rouge correspond à ce que je recherche comme résultat finale. Idéalement, je devrais avoir des HOLE NUMBER unique sans répétition. J'y suis un peu perdu, merci de m'aider!

    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
    19
    20
     
     
    SELECT 
    	DRILL_HOLE.HOLE_NUMBER, 
    	DRILL_HOLE.pp_y, 
    	MAX (UDEF_RADIOMETRIE.cps_max)as max_radiometrie,
    	'VERTICAL' as Hole_Path,
    	MAX (UDEF_PROBE_RESULTS.gtp) as eGT,
    	UDEF_PROBE_RESULTS.Length as eLength
     
    FROM 
    	DRILL_HOLE
    	INNER JOIN UDEF_RADIOMETRIE ON UDEF_RADIOMETRIE.HOLE_NUMBER = DRILL_HOLE.HOLE_NUMBER
    	INNER JOIN UDEF_PROBE_RESULTS ON UDEF_PROBE_RESULTS.HOLE_NUMBER = DRILL_HOLE.HOLE_NUMBER
     
    GROUP BY 
    	DRILL_HOLE.HOLE_NUMBER,
    	DRILL_HOLE.pp_y, 
    	UDEF_PROBE_RESULTS.Length,
    	UDEF_PROBE_RESULTS.gtp


    HOLE_NUMBER, pp_y,max_radiometrie,Hole_Path,eGT,eLength
    EC-07-08,-2334.608, 1005, VERTICAL, 0.090000 ,0.60
    EC-08-001,-2954.418, 520, VERTICAL, 0.006497 ,0.20
    EC-08-001,-2954.418, 520, VERTICAL, 0.010000 ,0.20
    EC-08-001,-2954.418, 520, VERTICAL, 0.010000 ,0.30
    EC-08-001,2954.418, 520, VERTICAL, 0.030000 ,0.50
    EC-08-001,-2954.418, 520, VERTICAL, 0.030000 ,0.60
    EC-08-001,-2954.418, 520, VERTICAL, 0.300000 ,2.10

    EC-08-003,-5939.372, 190, VERTICAL, 0.002156 ,0.10
    EC-08-003,-5939.372, 190, VERTICAL, 0.005915, 0.20
    EC-08-003,-5939.372, 190, VERTICAL, 0.010000 ,0.40
    EC-08-003,-5939.372, 190, VERTICAL, 0.020000, 0.50
    EC-09-01,NULL, 100, VERTICAL, 0.030000, 1.20
    EC-09-03,-2775.428, 110, VERTICAL, 0.038978 ,1.20
    EC-09-03,-2775.428, 110, VERTICAL, 0.174671, 2.20

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 814
    Points
    17 814
    Par défaut
    Si ça se complique il nous faudrait la description de vos tables ainsi que les données qui vont avec.

    Pour information et pour vos prochains messages, vous avez un dièse dans la boîte au dessus de la zone de texte. Ca permet d'afficher les balises codes dans lesquelles je vous invite à y mettre le votre !

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    voici un exemple de mes données ainsi que de la structure de mes tables

    TABLE DRILL_HOLE
    HOLE_NUMBER, pp_x, pp_y, pp_z,
    MT-07-79, 694554.434, 5759483.136, 656.77
    MT-07-85, 699060.23, 5759483.226, 556.078
    MT-07-92 , 698985.64, 5745815.845, 745.45
    MT-07-97, 694560.95, 5754483.156, 664.07
    MT-07-98, 645060.65, 5754483.126, 454.03
    MT-07-99, 694060.45, 5754583.145, 444.04

    TABLE UDEF_PROBE_RESULTS
    PROBE_RESULTS_id, HOLE_NUMBER, gtp, Length, max_grade,
    379, MT-07-79, 0.02, 0.6, 0.09
    385, MT-07-79, 0.24, 1.9, 0.35
    386, MT-07-79, 0.01, 0.4, 0.08
    387, MT-07-79, 0.01, 0.4, 0.03
    415, MT-07-85, 0. 27, 0.1, 0.02
    419, MT-07-85, 0.07, 0.8, 0.14
    420, MT-07-85, 0.05, 0.5, 0.22
    483, MT-07-97, 0. 37, 0.1, 0.03
    484, MT-07-97, 0.01, 0.3, 0.05
    485, MT-07-98, 0.04, 0.6, 0.14
    489, MT-07-98, 0. 44, 0.1, 0.03
    490, MT-07-98, 0. 05, 0.2, 0.02


    TABLE UDEF_RADIOMETRIE
    RADIOMETRIE_id, HOLE_NUMBER, cps_max, cps_min,
    1, MT-07-99, 200, 200,
    2, MT-07-85, 163, 50,
    4, MT-07-85, 163, 45,
    5, MT-07-92, 265, 265,
    6, MT-07-97, 188, 107,
    9, MT-07-98, 395, 72,
    12, MT-07-98, 108, 108,
    13, MT-07-98, 245, 107,
    17, MT-07-79, 395, 210,
    18, MT-07-79, 185, 650,
    Je souhaite avoir comme résultat final

    DRILL_HOLE.hole_number (unique)
    DRILL_HOLE.pp_x
    DRILL_HOLE.pp_y
    DRILL_HOLE.pp_z
    le max de UDEF_RADIOMETRIE.cps_max
    le max de UDEF_PROBE_RESULTS.gtp (si 2 identique, choisir le premier)
    UDEF_PROBE_RESULTS.Length
    UDEF_PROBE_RESULTS.max_grade
    Merci beaucoup!

  6. #6
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Citation Envoyé par Bram2 Voir le message
    DRILL_HOLE.hole_number (unique)
    DRILL_HOLE.pp_x
    DRILL_HOLE.pp_y
    DRILL_HOLE.pp_z
    le max de UDEF_RADIOMETRIE.cps_max
    le max de UDEF_PROBE_RESULTS.gtp (si 2 identique, choisir le premier)
    UDEF_PROBE_RESULTS.Length
    UDEF_PROBE_RESULTS.max_grade
    Deux remarques :
    - Tu ne peux pas exiger que hole_number soit unique dans la mesure où tu groupes également sur pp_x, y et z. Si tes tables sont ainsi faites que pour un hole_number, pp_x, y et z sont uniques, hole_number sera unique, sinon, inutile d'y compter
    - "si 2 identiques, choisir le premier". "Le premier" n'a pas de sens, à moins que tu ne spécifies un critère de tri, auquel cas, cela devient le MAX.

    Ces restrictions étant posées :
    - Puisque tu ne ramènes qu'un champ de UDEF_RADIOMETRIE, tu peux utiliser une sous-requête dans le SELECT,
    - Pour UDEF_PROBE_RESULTS, où tu veux ramener plusieurs champs d'une même ligne, tu utilises une sous-requête dans le WHERE, ou dans la jointure.
    Ce qui donne qqch du style (à tester) :
    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
    SELECT DRILL_HOLE.HOLE_NUMBER, 
    DRILL_HOLE.pp_x, DRILL_HOLE.pp_y, DRILL_HOLE.pp_z, 
    (SELECT MAX(cps_max) FROM UDEF_RADIOMETRIE
      WHERE HOLE_NUMBER = DRILL_HOLE.HOLE_NUMBER) AS cps_max,
    UDEF_PROBE_RESULTS.gtp AS eGT,
    UDEF_PROBE_RESULTS.Length,
    UDEF_PROBE_RESULTS.max_grade
    FROM DRILL_HOLE
    INNER JOIN UDEF_PROBE_RESULTS ON UDEF_PROBE_RESULTS.HOLE_NUMBER = DRILL_HOLE.HOLE_NUMBER
    AND UDEF_PROBE_RESULTS.gtp = 
      (SELECT MAX(gtp) FROM UDEF_PROBE_RESULTS
       WHERE HOLE_NUMBER = DRILL_HOLE.HOLE_NUMBER)
    GROUP BY DRILL_HOLE.HOLE_NUMBER, DRILL_HOLE.pp_y, 
    UDEF_PROBE_RESULTS.Length, UDEF_PROBE_RESULTS.gtp
    UDEF_PROBE_RESULTS.max_grade
    Roland

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup,
    tout semble fonctionner à l'exception d'un petit pépin que je crois être en mesure de régler dans les prochaines minutes.....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation fonction MAX
    Par AurelGTS dans le forum Langage SQL
    Réponses: 7
    Dernier message: 14/05/2007, 20h26
  2. [SQL Server 8] fonction Max --- selon des conditions
    Par Baquardie dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/01/2006, 22h06
  3. fonction MAX
    Par javaSudOuest dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/09/2005, 19h12
  4. Fonction MAX dans une condition WHERE
    Par borgfabr dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2004, 17h06
  5. Fonction max d'un tableau de variables...
    Par Romalafrite dans le forum ASP
    Réponses: 7
    Dernier message: 20/07/2004, 11h38

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