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 :

Récupérer la dernière ligne mise à jour d'un produit (max date ?)


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Récupérer la dernière ligne mise à jour d'un produit (max date ?)
    Bonjour,
    Mon problème est le suivant.

    J'ai une table "Produits" qui contient un ensemble de produits avec 5 champs. A chaque 30 du mois (DATE_MAJ), le prix d'un produit (PRIX) est mis à jour à compter du 1er du mois suivant (DATE_PROMOTION).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CODE     PRODUIT   DATE_PROMOTION          DATE_MAJ       PRIX 
    ------  ----------  ------------------     ----------      ------
    001      ProduitA     01/12/2012           30/11/2012      10
    001      ProduitA     01/01/2013           30/12/2012      8
    001      ProduitA     01/02/2013           30/01/2013      7
    ...
    002      ProduitB     01/11/2012           30/10/2012      17
    002      ProduitB     01/12/2012           30/11/2012      16
    002      ProduitB     01/01/2013           30/12/2012      14
    002      ProduitB     01/02/2013           30/01/2013      13
    Ma question est simple : comment récupérer pour chaque PRODUIT la dernière ligne, c'est-à-dire, celle qui contient à la fois la DATE_PROMOTION et la DATE_MAJ la plus récente ?

    C'est-à-dire obtenir comme résultat de requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    CODE     PRODUIT   DATE_PROMOTION          DATE_MAJ       PRIX 
    ------  ----------  ------------------     ----------      ------
    001      ProduitA     01/02/2013           30/01/2013      7
    002      ProduitB     01/02/2013           30/01/2013      13
    Merci par avance pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,
    Ce genre de question a déjà été posée... Le dernier est celui pour lequel il n'en existe pas de plus récent.
    Donc avec une jointure c'est rapide:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.*
    from MaTable t1
    left outer join MaTable t2 on t1.id = t2.id and t1.date1 < t2.date1 and t1.date2 < t2.date2
    where t2.id is null

    Tatayo.

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM PRODUITS A
    WHERE DATE_MAJ IN (SELECT MAX(DATE_MAJ) 
          FROM PRODUITS B
          WHERE A.CODE=B.CODE);

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    ou bien avec une fonction fenêtrée, qui pourrait être plus performante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
     
    ;WITH CTE AS (
    	SELECT 
    			CODE   
    		,	PRODUIT 
    		,	DATE_PROMOTION     
    		,	DATE_MAJ    
    		,	PRIX 
    		,	ROW_NUMBER() OVER(
    					PARTITION BY Code 
    					ORDER BY date_promotion DESC
    			) AS rn
    	FROM produit
    )
    SELECT 
    			CODE   
    		,	PRODUIT 
    		,	DATE_PROMOTION     
    		,	DATE_MAJ    
    		,	PRIX 
    FROM	cte 
    WHERE	rn  = 1

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Je ne suis pas sûr que ça réponde exactement au besoin:
    Citation Envoyé par Shinoda88 Voir le message
    Ma question est simple : comment récupérer pour chaque PRODUIT la dernière ligne, c'est-à-dire, celle qui contient à la fois la DATE_PROMOTION et la DATE_MAJ la plus récente ?
    Tatayo.

  6. #6
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    oui, en effet, mais il précise que le prix est inséré le dernier jour du mois pour le mois suivant...


    Car sinon, que doit-on renvoyer si pour un produit, on a une mise à jour en avril pour le mois de mars, et une autre en juin pour le mois de février ?


    Pour répondre exactement au besoin que tu cites, il faudrait donc ajouter un deuxième ROW_NUMBER pour avoir le rang de la mise à jour, et au final ne prendre que les lignes ou les deux rangs sont a 1...

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Cépafô

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/10/2012, 11h05
  2. Réponses: 5
    Dernier message: 12/05/2010, 03h29
  3. [MySQL] Connaitre la dernière ligne mise à jour d'une bdd ?
    Par beegees dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 02/08/2009, 19h02
  4. [Sunopsis v3] : récupérer le nombre de lignes mises à jour
    Par HarryCoco dans le forum Alimentation
    Réponses: 3
    Dernier message: 08/07/2007, 09h53
  5. Réponses: 6
    Dernier message: 09/06/2006, 19h22

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