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 :

Problème de récupération d'une information sur un group by


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 611
    Points : 359
    Points
    359
    Par défaut Problème de récupération d'une information sur un group by
    Bonjour,

    J'ai une table les lignes de réceptions des achats. Chaque ligne comprend un id_article, un id_achat_ligne et une date_livre.

    Je souhaite connaître le l'id_achat ligne correspondant à la date_livre la plus récente par id_article.
    En français dans le texte, je souhaite récupérer la ligne d'achat correspondant à la date de réception la plus récente par article.

    J'ai codé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.id_article, max(a.date_livre) 
    from toperp.t_achat_bl_ligne a    
    group by a.id_article
    Je récupère ainsi la dernière livraison par article mais je ne sais pas comment récupérer le id_achat_ligne.
    En ajoutant ce champ dans mon group by et dans le select, je perds l'id_article.

    Merci d'avance.
    Julien.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    quel est votre sgbd ?

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT a.id_article, a.id_achat_ligne, a.date_livre
    FROM toperp.t_achat_bl_ligne a
    INNER JOIN
    (
        SELECT id_article, max(date_livre) AS date_livre_max
        FROM toperp.t_achat_bl_ligne 
        GROUP BY id_article
    ) tmp 
        ON tmp.id_article = a.id_article
        AND tmp.date_livre_max = a.date_livre
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Fonctions de fenêtrage pour éviter les 2 scans de table sinon

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 611
    Points : 359
    Points
    359
    Par défaut
    Je travaille sur Oracle.

    La réponse proposée par Cinéphil me convient. Les temps de réponse me paraissent acceptables.

    Merci bien.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bein sous Oracle testé ceci aussi et comparé ... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with tmp as (
    SELECT a.id_article, a.id_achat_ligne, a.date_livre, 
    rank() over (partition by a.id_article order by a.date_livre desc) as rnk
    FROM toperp.t_achat_bl_ligne)
     
    SELECT a.id_article, a.id_achat_ligne, a.date_livre
    FROM TMP
    WHERE rnk = 1

  7. #7
    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
    Sur Oracle vous avez une solution sans sous-requête et donc un peu plus rapide (c'est pour ça qu'il faut préciser son SGBD) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      SELECT id_article
           , max(id_achat_ligne) keep (dense_rank first order by date_libre desc) as id_achat_ligne
           , max(date_livre)                                                      as date_livre
        FROM toperp.t_achat_bl_ligne    
    GROUP BY id_article;

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    ah tiens il faudra que je teste ca !

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

Discussions similaires

  1. récupération d'une valeur sur deux octets
    Par sanatou dans le forum C++
    Réponses: 6
    Dernier message: 09/01/2007, 16h35
  2. Réponses: 1
    Dernier message: 13/12/2006, 21h31
  3. Réponses: 2
    Dernier message: 13/09/2006, 18h39
  4. Problème de récupération dans une map
    Par sacdenoeud dans le forum C++
    Réponses: 7
    Dernier message: 26/03/2006, 08h40
  5. [MySQL] récupération d'une information
    Par SENCABOY dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 15/02/2006, 20h16

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