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 :

Grouper suivant la valeur maximum d'une colonne [8.4]


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    ingenieur calcul haute performance
    Inscrit en
    Février 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur calcul haute performance
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 51
    Par défaut Grouper suivant la valeur maximum d'une colonne
    Bonjour,

    J'ai à faire une requête un peu compliquée, et étant complètement novice en SQL j'avoue être à court d'idées.

    J'ai une table dont un extrait ressemble à ceci:

    HOG000000001    HOG000000001-consensus  191     191     341.3   341.1   2       190     2       190
    HOG000000002    HOG000127606-consensus  188     195     24.0    22.4    19      162     40      174
    HOG000000002    HOG000003646-consensus  188     247     22.2    10.6    18      47      105     133
    HOG000000002    HOG000003646-consensus  188     247     22.2    9.5     95      162     170     229
    HOG000000002    HOG000286625-consensus  188     671     21.9    21.2    3       148     496     632
    HOG000000002    HOG000236521-consensus  188     222     21.2    20.8    63      149     104     183
    HOG000000002    HOG000223036-consensus  188     237     20.2    19.7    85      121     167     204
    etc..

    et je voudrais obtenir quelque chose qui ressemble a ça:
    HOG000000002    HOG000127606-consensus  188     195     24.0    22.4    19      162     40      174
    HOG000000002    HOG000286625-consensus  188     671     21.9    21.2    3       148     496     632
    HOG000000002    HOG000236521-consensus  188     222     21.2    20.8    63      149     104     183
    HOG000000002    HOG000223036-consensus  188     237     20.2    19.7    85      121     167     204
    HOG000000002    HOG000003646-consensus  188     247     22.2    10.6    18      47      105     133
    HOG000000002    HOG000003646-consensus  188     247     22.2    9.5     95      162     170     229
    Les règles sont les suivantes:
    1)je requête sur la 1ere colonne jusque là pas de problème...
    2)les identifiants de la seconde colonne doivent être à côté lorsqu'ils sont identiques (ce n'est pas compliqué)...
    3)les groupes "à côté" définis ci-dessus doivent êtres classés selon la valeur maximale dans ce même groupe de la colonne numéro 6(ici au départ le couple [HOG000000002 HOG000003646-consensus] a été déplacé vers le bas car la valeur maximale de la colonne 6 pour ce groupe (en l'occurrence 10.6) est inférieure à celle des autres([HOG000000002 HOG000223036-consensus](19.7), [HOG000000002 HOG000236521-consensus](20.8))

    Du coup j'ai essayé d'utiliser une commande du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * 
    from hogenom_hits5 
    where col1='HOG000000002' 
    group by col1,col2 
    order by col6;
    mais bon il est évident que cela ne peut pas marcher,
    Quelqu'un aurait il une idée simple pour faire cette requête ?

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Par défaut
    avec group by col1,col2 cela signifie que toutes les autres colonnes devraient passer par un aggrégat pour afficher un résultat... donc pourquoi order by col6

    ton explication n'est pas très parlante... Pourrais-tu l'exprimer sous forme de contrainte un peu plus formelle ?


    Souhaites-tu faire ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM hogenom_hits5 
    WHERE col1='HOG000000002' 
    ORDER BY col2,col6;
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Membre averti
    Homme Profil pro
    ingenieur calcul haute performance
    Inscrit en
    Février 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur calcul haute performance
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 51
    Par défaut
    Tout d'abord merci pour la réponse,

    Eh bien en fait l'exemple que j'ai mis n'est pas très parlant, effectivement.

    En fait je voudrai faire une requête qui groupe les valeurs identiques des couples [col1,col2] et que ces groupes soient ordonnés par la valeur maximale (pour chacun de ces groupes) de la colonne 6.

    Dans ton exemple de code, le problème pour moi est que le résultat ne groupera par couple de colonnes [col1,col2].

    Je corrige donc ma requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM hogenom_hits5
    WHERE col1='HOG000000002'
    GROUP BY col1,col2
    ORDER BY max(col6);
    évidemment cela ne peut pas marcher car le max est calculé a partir du résultat du WHERE
    Moi je voudrais que le max soit calculé sur chaque groupe ET que toutes les colonnes soient affichées.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Est-ce ceci que vous voulez ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM hogenom_hits5
    WHERE col1='HOG000000002'
    ORDER BY MAX(col6) OVER(PARTITION BY col1,col2) DESC

  5. #5
    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 : 47
    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
    J'ai vraiment du mal à comprendre:
    Pouvez-vous m'éclairer un peu.
    @+

  6. #6
    Membre averti
    Homme Profil pro
    ingenieur calcul haute performance
    Inscrit en
    Février 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur calcul haute performance
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 51
    Par défaut
    Merci aieeeuuuuu, c'est exactement ce que je voulait.

    Cela marche maintenant il faut que je classe chacun des groupes par valeur décroissante...

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 059
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM hogenom_hits5
    WHERE col1='HOG000000002'
    ORDER BY MAX(col6) OVER(PARTITION BY col1,col2) DESC, col6 DESC
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  8. #8
    Membre averti
    Homme Profil pro
    ingenieur calcul haute performance
    Inscrit en
    Février 2013
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingenieur calcul haute performance
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 51
    Par défaut
    Ok tout marche nickel merci à tous......

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/06/2009, 10h59
  2. Calculer la valeur maximum d'une colonne
    Par chip_2008 dans le forum Fortran
    Réponses: 2
    Dernier message: 19/12/2008, 11h10
  3. Réponses: 2
    Dernier message: 01/12/2006, 10h09
  4. Réponses: 13
    Dernier message: 06/07/2006, 11h25
  5. Nombre de valeurs différentes dans une colonne
    Par KrusK dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/08/2005, 14h18

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