Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/07/2011, 14h07   #1
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
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 :
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.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 14h10   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
bonjour,

quel est votre sgbd ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 14h25   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 008
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 008
Points : 18 279
Points : 18 279
Envoyer un message via MSN à CinePhil
Code :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 14h39   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Fonctions de fenêtrage pour éviter les 2 scans de table sinon
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 16h47   #5
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Je travaille sur Oracle.

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

Merci bien.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 16h53   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Bein sous Oracle testé ceci aussi et comparé ... :

Code :
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
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 16h54   #7
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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;
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/07/2011, 16h56   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
ah tiens il faudra que je teste ca !
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h10.


 
 
 
 
Partenaires

Hébergement Web