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 :

Pb requete : Group by non pertinent


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Pb requete : Group by non pertinent
    Bonjour à tous,

    La réponse doit etre évidente mais je n'y arrive pas simplement :

    Voila ma table :

    id | idi | price
    1 | 1 | 400
    2 | 1 | 400
    3 | 2 | 420
    4 | 2 | 200
    5 | 2 | 150



    Et je veux qu'il reste :

    id | idi | price
    1 | 1 | 400
    5 | 2 | 150

    En gros je veux donc ne garder que les 'idi' différents avec des 'price' minimum.

    Un simple GROUP BY idi ne suffit pas.

    Merci de votre aide.

    Seb

  2. #2
    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 820
    Points
    17 820
    Par défaut
    Quelle est votre règle de choix pour gérer les égalités de prix ?
    Quel est votre SGBD ?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select nt.id, nt.idi, nt.price
    from nom_table nt
    join (
          select idi, min(price) as price
          from nom_table
          group by idi
         ) ntmin
         ON nt.idi = ntmin.idi
         AND nt.price = ntmin.price
    Comme le souligne Waldar, vous pouvez avoir plusieurs fois le même prix pour un même idi, correspondant donc à plusieurs id. Reste à savoir ce que vous voulez en faire dans ce cas.

  4. #4
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    A priori il choisirait la valeur la plus petite pour la colonne id.
    Cela simplifierai la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MIN(id) AS id, idi, MIN(price) AS price
    FROM laTable
    GROUP BY idi

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour la rapidité et la pertinence des réponses.
    En effet en cas d'égalité, peut importe quel id est pris, le 1er venu sera le bon.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MIN(id) AS id, idi, MIN(price) AS price
    FROM laTable
    GROUP BY idi
    a marché parfaitement.

    Seb

  6. #6
    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 820
    Points
    17 820
    Par défaut
    Et non cette solution n'est pas correcte.
    L'id associé ne correspondra pas au minimum du prix.

    Il faut soit repartir de la requête de Snipah, soit répondre à mes questions (en plus ça m'éviterait de poster pour rien ) !

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci Waldar !
    En effet ca ne va pas.

    EN cas d'égalité des prix, disons que je choisi l'id le plus petit.

    Cette solution marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT nt.id, nt.idi, nt.price
    FROM nom_table nt
    JOIN (
          SELECT idi, min(price) AS price
          FROM nom_table
          GROUP BY idi
         ) ntmin
         ON nt.idi = ntmin.idi
         AND nt.price = ntmin.price
    GROUP BY nt.idi
    Merci beaucoup Snipah.

    Mais c'est peut-etre un peu trop compliqué non?

  8. #8
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 104
    Points
    1 104
    Par défaut
    Effectivement m'a proposition n'était pas bonne.

    Mais cette requête ne retourne que les plus petits prix par idi.

    Si vous avez deux fois le prix minimum, vous aurez deux lignes.

    Ajoutez MIN(id) dans la requête principale si vous voulez sélectionner le plus petit id.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT MIN(nt.id) AS id, nt.idi, nt.price
    FROM nom_table nt
    JOIN (
          SELECT idi, min(price) AS price
          FROM nom_table
          GROUP BY idi
         ) ntmin
         ON nt.idi = ntmin.idi
         AND nt.price = ntmin.price
    GROUP BY nt.idi, nb.price

  9. #9
    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 820
    Points
    17 820
    Par défaut
    Voilà cette dernière requête est très bien.
    Mais selon les SGBD (notamment Oracle / SQL Server / PostGreSQL), on peut mieux faire !

Discussions similaires

  1. [SQL Server] Donnee de type text dans un GROUP BY non permis
    Par Tartenpion dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/03/2006, 17h31
  2. Réponses: 5
    Dernier message: 13/02/2006, 13h59
  3. probleme lors d'une requete sql (controle non activé)
    Par junty dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/09/2005, 15h45
  4. Réponses: 3
    Dernier message: 15/07/2005, 17h58
  5. GROUP_ID dans requete GROUP BY
    Par quemener dans le forum Oracle
    Réponses: 11
    Dernier message: 25/10/2004, 10h59

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