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 PostgreSQL Discussion :

Obtenir l'id des lignes dont la valeur d'une colonne est la plus grande avec un GROUP BY [9.4]


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 7
    Par défaut Obtenir l'id des lignes dont la valeur d'une colonne est la plus grande avec un GROUP BY
    Bonjour,

    Je fais à nouveau appel à l'expertise des membres de ce forum pour m'aider à résoudre un problème dont la solution n'a pas été trouvée après moult tests et recherches.

    Je cherche à obtenir l'identifiant start_end dont la valeur de la colonne tot_cost est la plus grande tout en faisant un regroupement par start_vid.

    (il s'agit de données à composante spatiale générées à partir de l'extension pg_routing de PostGIS. )


    • start_end correspond aux identifiants du début et de fin de chaque chemin concaténés et séparés par un "_"
    • tot_cost correspond à la longueur totale en mètres de chaque chemin
    • start_vid correspond à l'identifiant du premier nœud de chaque chemin
    • num_plat correspond à l'identifiant d'un objet spatial en lien avec le chemin


    Ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE "TEST2"."test" AS
    SELECT "t1"."start_vid" as "start_vid", max("t1"."tot_cost") as "tot_cost","t1"."start_end" as "start_end","t1"."num_plat" as "num_plat"
    FROM "TEST2"."graph2" as "t1"
    GROUP BY "start_vid","start_end","num_plat"
    ... me donne presque le résultat attendu mais je conserve toujours plusieurs lignes pour un même nœud de départ start_vid :
    Nom : Capture.JPG
Affichages : 382
Taille : 53,6 Ko

    Je souhaiterais obtenir qu'une ligne par start_vid avec son identifiant start_end dont la valeur comprise dans tot_cost est la plus grande par start_vid. Dans l'exemple ce sont les lignes 460 et 361 pour les start_vid 1 et 44.

    J'espère avoir été clair. Merci de m'avoir lu et merci d'avance pour vos réponses.

  2. #2
    Membre Expert
    Avatar de alassanediakite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2006
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Mali

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2006
    Messages : 1 599
    Billets dans le blog
    8
    Par défaut
    Salut
    Le problème se situ au niveau des colonne "start_end","num_plat", il ne doivent pas être dans le GROUP BY et doivent être agrégées.
    Voici une solution...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TABLE "TEST2"."test" AS
    SELECT "t1"."start_vid" as "start_vid", max("t1"."tot_cost") as "tot_cost",max("t1"."start_end") as "start_end", max("t1"."num_plat") as "num_plat"
    FROM "TEST2"."graph2" as "t1"
    GROUP BY "start_vid"
    @+

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 7
    Par défaut
    Merci pour ta réponse rapide!

    Malheureusement cela ne fonctionne pas. Je récupère bien une seule ligne par start_vid mais le start_end ne correspond pas toujours. Par exemple pour le start_vid 44, j'obtiens le start_end 44_45 alors que c'est le start_end 44_30 qui correspond à la longueur de chemin la plus longue ..

    Mais merci quand même!

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 137
    Par défaut
    Question maintes fois posées, avec plusieurs solutions dont celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  start_vid
        ,   tot_cost
        ,   start_end
        ,   num_plat
    FROM    TEST2.graph2    AS t1
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    TEST2.graph2    AS t2
                WHERE   t1.start_vid    = t2.start_vid
                HAVING  t1.tot_cost     = MAX(t2.tot_cost)
            )
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 7
    Par défaut
    Merci al1_24, la solution que vous proposez fonctionne !

    Elle n'est pas évidente à bien comprendre du premier coup malgré les quelques heures de SQL que j'ai pu suivre en master (c'est la première fois que je vois un "SELECT NULL" dans une requête, pour les curieux l'explication ici : https://www.developpez.net/forums/d5...p-select-null/ )

    Merci encore !

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2017
    Messages : 7
    Par défaut
    Salut,

    Plutôt que de regrouper les résultats par start_vid, il était plus intéressant pour mon étude de les regrouper par num_plat. J'ai donc repris le code écrit par al1_24 en modifiant le WHERE t1.start_vid = t2.start_vid par WHERE t1.num_plat = t2.num_plat.

    Bien que la solution fonctionne les résultats obtenus sont un peu déconcertants. J'obtiens en effet les bonnes lignes mais parfois en doublon et parfois non. Dans ma table initiale les points de départ sont aussi les points d'arrivée et les chemins sont donc parcourus dans les deux sens. Les chemins 18_32 et 32_18 auront donc la même longueur tot_cost. S'il s'agit des chemins les plus longs du num_plat et si la fonction MAX() peut retourner plusieurs résultats alors je comprendrais d'obtenir ces deux chemins en doublon.

    Cependant je n'obtiens pas systématiquement les deux résultats. Il arrive qu'une seule ligne soit retournée sans que je n'arrive à comprendre pourquoi. Ma colonne est de type float 8. Pensez-vous qu'il pourrait s'agir de la précision des valeurs contenues dans la colonne tot_cost qui pourraient être très légèrement différentes entre les deux sens du parcours en raison d'un arrondi et donc amener la fonction MAX() à ne trouver qu'une valeur maximum ? Je précise que j'ai des valeurs de longueur affichées à 12 chiffres après la virgule et que dans le cas ou je n'obtiens qu'un seul chemin les valeurs de longueur affichées sont exactement les mêmes pour les deux sens.

    Merci

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/03/2015, 23h00
  2. Réponses: 4
    Dernier message: 21/07/2011, 16h25
  3. Comment filtrer des lignes sur la valeur d'une colonne
    Par BerBiX dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/06/2010, 14h46
  4. [XL-2000] Suppression de lignes dont la valeur d'une colonne est particulière
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 14/01/2010, 21h35
  5. Réponses: 5
    Dernier message: 15/02/2008, 12h28

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