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 et SQL. Discussion :

Requête date max, date précédente et valeurs associées


Sujet :

Requêtes et SQL.

  1. #1
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut Requête date max, date précédente et valeurs associées
    Bonjour à tous,

    Je cherche à faire une requête à partir du type de données suivantes :
    ID, Date, Valeur.

    En fait je voudrais sélectionner pour chaque ID, la date Max avec sa valeur associée et la date précédente à la date max avec sa valeur associée et une différence des 2 valeurs.
    C'est-à-dire j'ai ce genre de données ds ma table :

    25, 15/01/2010, 6
    25, 12/04/2011, 4
    25, 13/05/2000, 4
    26, 17/12/2000, 3
    26, 18/11/2003, 7

    Et j'aimerais avoir une requête qui fait ça :
    ID, Max(Date), Val Max Date, DateprécDateMax, Val Dateprécdatemax, Diff
    25, 12/04/2011, 4, 15/01/2010, 6, -2
    26, 18/11/2003, 7, 17/12/2000, 3, 4

    Est-ce possible de sélectionner la date précédente à la date max? Et cmt y associer les bonnes valeurs?


    S'il n'existe pas de fonction ou de méthode pr sélectionner la date précédente à la date max, les différence entre la date max et la date préc sont tjs de 7 jours, j'ai alors fait cette requête qui "fonctionne" plus ou moins mais elle ne donnera parfois des doubles lignes de date...dûent à la fonction Dateadd imbriquée...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT Table.ID, Table.Date, Table.Valeur, Table_1.Date, Table_1.Valeur, (Table.Valeur-Table_1.Valeur) AS diff
    FROM Table INNER JOIN Table AS Table_1 ON Table.ID = Table_1.ID
    WHERE (((Table.DATE) In (Select Max(Date)
    From Table
    Group by ID)) AND ((Table_1.DATE) In (
    SElect Dateadd("d",-7,Max(Date))
    From Table
    Group by ID)))
    GROUP BY Table.ID, Table.Date, Table.Valeur, Table_1.Date, Table_1.Valeur;
    Quelqu'un aurait-il une méthode ?

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 758
    Points : 57 780
    Points
    57 780
    Billets dans le blog
    42
    Par défaut
    Bonjour Nitromard,

    si on est sûr que les dates sont espacées de 7 jours, on peut essayer :

    Code sql : 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
    SELECT u.id, 
           u.ladatemax, 
           t1.valeur, 
           Dateadd("d", -7, u.ladatemax) AS dateprecedente, 
           t2.valeur                     AS valeurprecedente, 
           t1.valeur - t2.valeur         AS difference 
    FROM   ((SELECT id, 
                   MAX(ladate) AS ladatemax 
            FROM   latable 
            GROUP  BY id) AS u 
            INNER JOIN latable AS t1 
              ON ( u.ladatemax = t1.ladate ) 
                 AND ( u.id = t1.id )) 
           LEFT JOIN latable AS t2 
             ON ( t2.ladate = Dateadd("d", -7, u.ladatemax) ) 
                AND ( u.id = t2.id );

    attention à la table [Table] et au champ [Date] qui sont des mots réservés.

  3. #3
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bonjour f-leb,

    Merci du conseil pour Table et Date (ce sont des noms fictifs pour simplifier les notations de mon problème ^^).
    Je vais tester cela immédiatement.

  4. #4
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Voilà, le test est fait, ça marche impec!
    Le problème que j'avais avec l'autre requête n'apparait plus.

    Bon par contre j'ai parfois des ID qui n'apparaissent qu'une seule fois dans la table d'origine.
    Du genre :

    17, 12/12/2006, 4

    Du coup la requête les affiches quand mm avec, bien sûr, rien en valeur précédente et du coup rien en Difference.

    Cmt faire pr ne pas les faire afficher?

    Et pour une date précédente qui serait n'importe quand, vous avez une idée? Un cas similaire déjà rencontré? (si non cela n'a pas d'importance, c'est, on va dire, plus de la culture générale ^^)

    Merci en tout cas pour votre aide ^^

  5. #5
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bon avec un simple Is not null ds une condition where à la fin, cela fonctionne très bien ^^.

    En tout cas merci bcp.

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 758
    Points : 57 780
    Points
    57 780
    Billets dans le blog
    42
    Par défaut
    ...ou alors en remplaçant le LEFT JOIN par INNER JOIN il me semble que ça marche aussi.

    Pour des dates espacées quelconques, c’est un peu plus long :
    Code sql : 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
    SELECT u.id, 
           u.ladatemax, 
           t1.valeur, 
           t2.ladate             AS dateprecedente, 
           t2.valeur             AS valeurprecedente, 
           t1.valeur - t2.valeur AS difference 
    FROM   ((SELECT id, 
                   MAX(ladate) AS ladatemax 
            FROM   latable 
            GROUP  BY id) AS u 
            INNER JOIN latable AS t1 
              ON  u.ladatemax = t1.ladate  
                 AND  u.id = t1.id ) 
           INNER JOIN latable AS t2 
             ON u.id = t2.id 
    WHERE    t2.ladate  = (SELECT MAX(v.ladate) 
                               FROM   latable v 
                               WHERE  v.id = u.id 
                                      AND v.ladate < u.ladatemax) ;

    A tester…

  7. #7
    Membre actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2011
    Messages : 175
    Points : 223
    Points
    223
    Par défaut
    Bonjour,

    Ca a l'air de fonctionner ^^!

    Merci beaucoup et bonne continuation à vous !

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

Discussions similaires

  1. Requête avec une date max
    Par xehyan dans le forum Langage SQL
    Réponses: 4
    Dernier message: 20/05/2009, 10h21
  2. [BO XIr2] Champ associé à Max(date)
    Par Enthau dans le forum Débuter
    Réponses: 10
    Dernier message: 25/09/2007, 08h49
  3. Requête avec max date et champs correspondants
    Par sl1980 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2007, 00h01
  4. Select max(date) max(heure)
    Par silver.spike dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/06/2007, 19h26
  5. Réponses: 4
    Dernier message: 17/11/2006, 10h46

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