2016-01-18 1 views
1

J'ai une table avec un identifiant id, d'une valeur, valider et valeurCalculer la différence de temps et le calcul entre deux rangées

MyTable ressemble à ceci:

+------+------------+---------------------+-------+ 
| ID | VALUEID | VALUEDATE   | VALUE | 
+------+------------+---------------------+-------+ 
| 1 | 2   | 2015-12-21 16:30:00 | 50 | 
| 2 | 1   | 2015-12-22 16:33:00 | 54 | 
| 3 | 8   | 2015-12-23 16:54:00 | 58 | 
| 4 | 6   | 2015-12-24 17:11:00 | 62 | 
| 5 | 8   | 2015-12-25 17:11:00 | 66 | 
| 6 | 10   | 2015-12-26 10:01:00 | 70 | 
| 7 | 7   | 2015-12-27 11:00:00 | 74 | 
| 8 | 9   | 2015-12-28 12:03:00 | 78 | 
| 9 | 7   | 2015-12-29 12:05:00 | 82 | 
| 10 | 6   | 2015-12-30 12:05:00 | 86 | 
| 11 | 3   | 2016-01-01 13:19:00 | 90 | 
| 12 | 2   | 2016-01-02 13:20:00 | 94 | 
| 13 | 7   | 2016-01-03 13:21:00 | 98 | 
| 14 | 6   | 2016-01-04 13:51:00 | 102 | 
| 15 | 9   | 2016-01-05 13:53:00 | 106 | 
| 16 | 3   | 2016-01-06 14:51:00 | 110 | 
| 17 | 6   | 2016-01-07 15:31:00 | 114 | 
| 18 | 10   | 2016-01-08 15:32:00 | 118 | 
| 19 | 7   | 2016-01-09 15:33:00 | 122 | 
| 20 | 6   | 2016-01-10 15:34:00 | 126 | 
+------+------------+---------------------+-------+ 

Quand je veux le résultat, which valueid = 6. J'utilise ce code.

id SELECT, valueid, valuedate, valeur à partir MyTable OÙ valueid = 6

Le résultat ressemble à ceci.

+------+------------+---------------------+-------+ 
| ID | VALUEID | VALUEDATE   | VALUE | 
+------+------------+---------------------+-------+ 
| 4 | 6   | 2015-12-24 17:11:00 | 62 | 
| 10 | 6   | 2015-12-30 12:05:00 | 86 | 
| 14 | 6   | 2016-01-04 13:51:00 | 102 | 
| 17 | 6   | 2016-01-07 15:31:00 | 114 | 
| 20 | 6   | 2016-01-10 15:34:00 | 126 | 
+------+------------+---------------------+-------+ 

Mais je veux calculer les résultats.

Je voudrais compter combien de jours l'entrée précédente est. En outre, un petit calcul devrait être calculé. Valeur B (moins) Une valeur (diviser) jours.

J'ai essayé quelque chose comme ça, mais je n'ai pas obtenu le résultat.

SELECT A.id, A.valueid, A.valuedate, a.value, (B.valuedate - A.valuedate) AS valuedatediff, (B.value - a.value/valuedatediff) AS valuecalc DE MyTable A INNER JOIN MyTable BMARCHE B.valueid = (A.valueid + 1) où A.valueid = 6

Quoi qu'il en soit, je voudrais ce résultat.

+------+------------+---------------------+-------+---------------+-----------+ 
| ID | VALUEID | VALUEDATE   | VALUE | VALUEDATEDIFF | VALUECALC | 
+------+------------+---------------------+-------+---------------+-----------+ 
| 4 | 6   | 2015-12-24 17:11:00 | 62 | 5    | 4.8  | 
| 10 | 6   | 2015-12-30 12:05:00 | 86 | 5    | 3.2  | 
| 14 | 6   | 2016-01-04 13:51:00 | 102 | 3    | 4   | 
| 17 | 6   | 2016-01-07 15:31:00 | 114 | 3    | 4   | 
| 20 | 6   | 2016-01-10 15:34:00 | 126 | 0    | 0   | 
+------+------------+---------------------+-------+---------------+-----------+ 

Merci!

Répondre

2

.: par exemple

SELECT a.id 
    , a.valueid 
    , a.valuedate 
    , a.value 
    , b.value - a.value valuediff 
    , COALESCE(DATEDIFF(b.valuedate,a.valuedate),0) valuedatediff 
    , COALESCE((b.value - a.value)/(DATEDIFF(b.valuedate,a.valuedate)),0) valuecalc 
    FROM 
    (SELECT x.* 
      , MIN(y.id) min_id 
     FROM my_table x 
     LEFT 
     JOIN my_table y 
      ON y.valueid = x.valueid 
      AND y.id > x.id 
     WHERE x.valueid = 6 
     GROUP 
      BY x.id 
    ) a 
    LEFT 
    JOIN my_table b 
    ON b.id = a.min_id; 
+0

Wow! Merci mec! Tu as sauvé ma journée. –

0

Un peu fixe à la sortie.

SELECT a.id 
    , a.valueid 
    , a.valuedate 
    , a.value 
    , a.value - b.value valuediff 
    , DATEDIFF(a.valuedate,b.valuedate) AS valuedatediff 
    , (a.value - b.value)/(DATEDIFF(a.valuedate,b.valuedate)) AS valuecalc 
    FROM 
    (SELECT x.* 
      , MAX(y.id) max_id 
     FROM my_table x 
     LEFT 
     JOIN my_table y 
      ON y.valueid = x.valueid 
      AND y.id < x.id 
     WHERE x.valueid = 6 
     GROUP 
      BY x.id 
    ) a 
    LEFT 
    JOIN my_table b 
    ON b.id = a.max_id 
ORDER BY a.valuedate DESC 

Et maintenant, la date la plus récente en premier.

+------+------------+---------------------+-------+-----------+---------------+-----------+ 
| ID | VALUEID | VALUEDATE   | VALUE | VALUEDIFF | VALUEDATEDIFF | VALUECALC | 
+------+------------+---------------------+-------+-----------+---------------+-----------+ 
| 20 | 6   | 2016-01-09 15:34:00 | 126 | 12  | 3    | 4   | 
| 17 | 6   | 2016-01-06 15:31:00 | 114 | 12  | 3    | 4   | 
| 14 | 6   | 2016-01-03 13:51:00 | 102 | 16  | 4    | 4   | 
| 10 | 6   | 2015-12-30 12:05:00 | 86 | 24  | 6    | 4   | 
| 4 | 6   | 2015-12-24 17:11:00 | 62 | NULL  | NULL   | NULL  | 
+------+------------+---------------------+-------+-----------+---------------+-----------+ 

Espérons que cela est juste :)

+0

Si cette réponse est bonne, alors la question est fausse ;-) – Strawberry