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 :

[MySQL] detecter des variations de prix


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 4
    Points : 7
    Points
    7
    Par défaut [MySQL] detecter des variations de prix
    Bonjour,

    Pour simplifier, le schema de ma base est le suivant :

    ITEM(id_item, nom_item) où id_item est clé primaire.

    PRIX_ITEM(id_item, prix, date_releve) où id_item est clé étrangère.

    La cardinalité de l'association entre item et prix_item est de 1 pour n, c'est-à-dire que pour un ITEM donné, on a plusieurs PRIX (prix du même item relevés à différentes dates).
    Le nombre de PRIX relevés par ITEM n'est pas constant et n'est pas prédictible.

    Je peine à écrire une requête qui me permettrait d'identifier les items dont le dernier prix relevé ("dernier" au sens chronologique de l'attribut date_releve) soit inférieur au prix pénultième ("avant-dernier" au sens chronologique de l'attribut date_releve).

    Par exemple, les items tels que :
    PRIX_ITEM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID_ITEM         PRIX      DATE
    ------------------------------------------------
    3               10.25     1er novembre
    3               10.25     2 novembre
    3               10.15     3 novembre
    car le dernier prix relevé est inférieur à l'avant-dernier prix.

    Exemple d'item non souhaité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID_ITEM         PRIX      DATE
    ---------------------------------------------
    5               10.45     1er novembre
    5               10.45     2 novembre
    5               10.45     3 novembre
    car le dernier prix relevé (3 nov) n'est pas strictement inférieur à l'avant-dernier prix (2 nov).


    Je bloque lamentablement. Quelqu'un aurait-il des pistes ?
    (j'utilise MySQL).

    D'avance merci,
    Alexandre

  2. #2
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    j'ai du mal à comprendre le problème,
    On peut avoir un jeu de données en exemple ?

    Tu cherches en fait les produits dont le prix à baissé ?


    Sinon à froid, je ferai qqch dans ce goût là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select a.id, a.prix, b.prix, a.prix-b.prix as diff
    from prix_item as a
    inner join prix_item as b
    on a.id = b.id
    and a.date = dateadd(day,-1,b.date)
    where a.prix-b.prix < 0
    mais ça risque de poser pb avec les jours non-ouvrés

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select a.id, a.prix, b.prix, a.prix-b.prix as diff
    from prix_item as a
    inner join prix_item as b
    on a.id = b.id
    and a.date = dateadd(day,-1,b.date)
    where a.prix-b.prix < 0
    Merci pour ta réponse. Ce n'est cependant pas complètement ce que je cherche:

    1) si je comprends bien, la requête ci-dessus fournit la liste des baisses de prix
    entre deux relevés consécutifs quelconques (dateadd(day,-1)).
    Pour ma part, je souhaite détecter les variations de prix seulement entre le DERNIER et l'AVANT-DERNIER relevés d'un item donné (au sens de l'attribut 'date').

    2) On ne peut formuler aucune hypothèse sur les dates de relevé successives d'un item. L'écart entre 2 relevés est un intervalle imprédictible (de 1sec à plusieurs jours).
    Cet écart n'est pas constant entre deux relevés et n'est pas constant pour les relevés de deux items différents.

    j'ai du mal à comprendre le problème,
    On peut avoir un jeu de données en exemple ?
    En considérant seulement la table PRIX_ITEM, voici le jeu de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ID_ITEM   PRIX   DATE_RELEVE
    --------  ----   -------------
    1         900    2007-11-01 10:12:35
    1         900    2007-11-01 10:12:36
    2         800    2007-11-01 10:12:35
    2         820    2007-11-02 13:00:45
    2         820    2007-11-02 14:23:11
    3         950    2007-11-01 10:12:35
    3         950    2007-11-04 10:11:37
    3         940    2007-11-05 10:38:45
    Le résultat de la requête que je souhaite écrire devrait retourner :
    - item3 parce que son prix a varié entre l'avant-dernier relevé (10:11:37, 950€) et le dernier relevé (10:38:45, 940€).
    En revanche, la requête ne devrait pas retourner :
    - item1 car il n'y a aucune variation de prix
    - item2 car il n'y a aucune variation de prix entre le dernier et l'avant-dernier relevé

    J'éspère avoir été clair (pas facile à expliquer)... encore merci de ton aide,

    Alexandre

  4. #4
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    1°) et bien avec un having a.date = max(date) tu dois pouvoir t'en sortir
    2°) il va falloir utiliser une sous-requête pour prendre l'avant dernière date et remplacer mon dateadd
    Quelque chose comme (il y a sûrement plus élégant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(date) from latable where date not in (select max(date) from latable)

Discussions similaires

  1. Detection des touches enfoncées par API
    Par Ingham dans le forum VB 6 et antérieur
    Réponses: 31
    Dernier message: 20/02/2006, 12h30
  2. Detection des enfants avant leurs construction
    Par qqchose dans le forum C++
    Réponses: 10
    Dernier message: 12/02/2005, 17h39
  3. Administration MySQL gestion des utilisateurs
    Par MaxiMax dans le forum Administration
    Réponses: 2
    Dernier message: 01/07/2004, 13h56
  4. LYCOS ET MYSQL - Intégrer des images dans une base!
    Par archeo dans le forum Installation
    Réponses: 3
    Dernier message: 06/04/2004, 13h45
  5. Réponses: 2
    Dernier message: 26/02/2003, 15h18

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