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 MySQL Discussion :

Différence valeur entre ligne


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut Différence valeur entre ligne
    Bonjour.

    J'ai une table avec 2 colonnes : date_time (datetime) et value (int)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    2011-05-03 20:00:00     200
    2011-05-03 20:15:00     220
    2011-05-03 20:30:00     210
    2011-05-03 20:45:00     190
    et je cherche à faire la différence des value pour obtenir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    2011-05-03 20:15:00     20  (220 - 200)
    2011-05-03 20:30:00     -10 (210 - 220)
    2011-05-03 20:45:00     -20 (190 - 210)
    Je ne parviens pas à trouver la requête car je n'ai pas d'id (et je ne peux pas modifier la structure de la table.

    Quelle requête peut me retourner ce résultat svp ?

    Merci d'avance,
    Cordialement
    développeur en folie cherche à ... développer encore plus

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 948
    Points : 5 847
    Points
    5 847
    Par défaut
    MySql n'est pas le SGBD le plus adapté pour ce genre de requête car il ne connaît pas les fonctions analytiques, notamment LAG. Il faut donc passer par quelque chose de moins perfomant.

    J'ai quand même un doute sur la validité de ma requête car je pense que t1.date_time dans la ligne :
    where t3.date_time < t1.date_time
    est un peu bas (2 niveaux de requêtes corrélées, il me semble que c'est trop bas).

    J'ai testé sur oracle en évitant les fonctionnalités spécifiques, et la requête a fonctionné, donc je propose quand même la solution. Mais je ne sais pas si elle fonctionnera sur MySql car même sur Oracle je trouve étrange qu'elle ait fonctionné...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select date_time,
           val - prev_val as diff
      from (select date_time,val,
                   (select val 
                      from t t2 
                     where date_time = (select max(date_time) 
                                          from t t3 
                                         where t3.date_time < t1.date_time)
                   ) as prev_val
              from t t1
            ) t4
      where prev_val is not null
    [edit] En fait non, ça semble normal que ça fonctionne, pour que l'erreur se produise il faudrait en plus une sous-requetête dans la requête corrélée du select.
    Ca devrait donc aussi fonctionner sur MySql.

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 948
    Points : 5 847
    Points
    5 847
    Par défaut
    Bon finalement je ne suis pas sûr que ça fonctionne sur MySql...
    D'après un expert Oracle ma requête ne devrait pas forcément fonctionner sur Oracle même si elle fonctionne...

    Peux tu nous faire un retour sur MySql stp ? ou quelqu'un peut il tester ?

    Attention même si elle fonctionne sur MySql aujourd'hui, il est peut être possible que ça change dans les versions à venir, il faudrait pour en être sûr avoir l'avis d'un expert MySql ou d'un expert SQL ANSI.

  4. #4
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Bonjour.

    Et bien même si elle n'est pas censé fonctionner, elle fait parfaitement ce que j'attends d'elle
    Le résultat correspond tout à fait à mes attentes.

    Merci de ton aide
    développeur en folie cherche à ... développer encore plus

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 955
    Points
    52 955
    Billets dans le blog
    6
    Par défaut
    Le risque de cette requête est
    1) qu'elle plante s'il y a des doublons (une des sous requêtes introduite par "WHERE date_time = (" peut retourner de multiples valeurs)
    2) qu'elle ne fournisse pas le bon résultat après correction de 1).

    Il n'y a pas de véritables solutions de remplacement aux fonctions analytiques comme le ranking, la numérotation ou LEAD et LAG....
    Sans compter que les temps de réponse sont catastrophique en comparaisons à une solution avec ces fonctions...

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Le risque de cette requête est
    1) qu'elle plante s'il y a des doublons (une des sous requêtes introduite par "WHERE date_time = (" peut retourner de multiples valeurs)
    2) qu'elle ne fournisse pas le bon résultat après correction de 1).

    Il n'y a pas de véritables solutions de remplacement aux fonctions analytiques comme le ranking, la numérotation ou LEAD et LAG....
    Sans compter que les temps de réponse sont catastrophique en comparaisons à une solution avec ces fonctions...

    A +
    Du coup, que me conseillerais-tu pour pallier à ces problèmes stp ?
    développeur en folie cherche à ... développer encore plus

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 948
    Points : 5 847
    Points
    5 847
    Par défaut
    Effectivement, je n'avais pas pensé au doublon.
    doudouallemand, pour être sûr que ça ne plantera pas dans ton cas précis tu peux rajouter une contrainte d'unicité sur date_time comme ça tu sera sûr que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    SELECT val 
      FROM t t2 
     WHERE date_time =
    ...
    renverra toujours une ligne. Je pense que sur un date_time cette contrainte a un sens même fonctionel, mais c'est à toi de t'en assurer.

    Sinon, donc à priori pas de contre-indication de la norme sur l'utilisation de t1.date_time dans WHERE t3.date_time < t1.date_time.

    Merci de ton retour SQLPro.

  8. #8
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Petit complément : si je souhaite que sur les dates, ce ne soit plus entre lignes mais entre la première valeur d'une journée et la dernière valeur de cette journée, pour tous les jours présents, je dois modifiés comment la requête svp ?

    Dans mon exemple ci-dessous, on fera aura donc une seule ligne de retour qui fera la différence entre la valeur de 20h (1ère de la journée) et la valeur de 20h45 (dernière de la journée).

    Merci
    développeur en folie cherche à ... développer encore plus

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 948
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 948
    Points : 5 847
    Points
    5 847
    Par défaut
    Ben à priori dans ce cas c'est beaucoup plus simple, il suffit de faire la différence entre la date min et la date max par jour, non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select DATE_FORMAT(date_time, '%Y-%m-%d'), max(date_time) - min(date_time) as diff
      from t
     group by DATE_FORMAT(date_time, '%Y-%m-%d')
    Il faudra peut être utiliser DATE_SUB à la place de - (moins), et peut être passer par une sous requête.

  10. #10
    Membre éclairé
    Avatar de doudoustephane
    Homme Profil pro
    Gérant
    Inscrit en
    Août 2005
    Messages
    1 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Août 2005
    Messages : 1 129
    Points : 862
    Points
    862
    Par défaut
    Merci de ta réponse.
    Cordialement
    développeur en folie cherche à ... développer encore plus

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

Discussions similaires

  1. [AC-2007] Calcul d'écart de valeur entre chaque ligne d'un champ d'une requête
    Par Ahlmael dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/12/2014, 11h54
  2. Réponses: 2
    Dernier message: 01/08/2013, 19h13
  3. Réponses: 6
    Dernier message: 25/10/2011, 15h52
  4. Changement de valeur entre 2 lignes
    Par ForgetTheNorm dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/04/2010, 14h22
  5. Différence saut de ligne entre FF et IE
    Par Stéph utilisateur d'acces dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 11/01/2009, 11h13

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