2012-08-06 34 views
0

我有,有一个总运行一个MySQL表:如何确定每个样本在mysql中的日积累值?

+---------------------+--------+ 
| Timestamp   | Total | 
+---------------------+--------+ 
| 2012-07-04 05:35:00 | 1.280 | 1.280-1.280 = 0 
| 2012-07-04 09:25:00 | 2.173 | 2.173-1.280 = 0.893 
| 2012-07-04 09:30:00 | 2.219 | 2.219-1.280 = 0.939 
| 2012-07-04 15:00:00 | 7.778 | 7.778-1.280 = 6.498 
| 2012-07-04 21:05:00 | 13.032 | 13.032-1.280 = 11.752 
| 2012-07-04 22:00:00 | 13.033 | 13.033-1.280 = 11.753 
| 2012-07-05 05:20:00 | 13.033 | 13.033-13.033 = 0 
| 2012-07-05 07:10:00 | 13.140 | 13.140-13.033 = 0.107 
| 2012-07-05 10:15:00 | 14.993 | 14.993-13.033 = 1.960 
| 2012-07-05 11:35:00 | 16.870 | 16.870-13.033 = 3.837 
+---------------------+--------+ 

我正在寻找的是确定每个区间聚集的每天增加一个查询。 我试图展示期望的结果以及每行后面的计算。我已经尝试过几次加入,但不知何故,我无法确定每天的初始价值。

谢谢。

+0

你给一个列命名或产生一个'timestamp',但它显示'dateTime'('%Y-%m-%d%H:%i:%s') – arnoudhgz 2012-08-06 20:32:54

+0

@ w0051977:我试图解决这个问题一个子查询,但只适用于一天而不是多天:其中DAT E(TimeStamp)= CURDATE()order by Total ASC limit 1) yjb 2012-08-07 19:58:17

+0

@arnoudhgz:是的,我知道输出显示格式化的时间戳。我只是试图证明这个列是基于时间戳的,这些时间戳并不总是在一个固定的时间间隔或开始时间。如果后者是这种情况,我可以每天搜索一个特定的时间戳。 – yjb 2012-08-07 20:01:03

回答

0

我不能保证这个查询的效率,但它确实让你你正在寻找的结果:

SELECT t1.`Timestamp`, t1.`Total`, 
     CASE WHEN t1.`timestamp` = 
      (SELECT MIN(t2.`Timestamp`) 
      FROM myTable t2 
      WHERE DATE(t2.`Timestamp`)=DATE(t1.`Timestamp`)) 
     THEN 0 
     ELSE t1.`Total` - (SELECT MIN(t3.`Total`) 
       FROM myTable t3 
       WHERE DATE(t3.`Timestamp`)=DATE(t1.`Timestamp`))   
     END AS Diff 
FROM myTable t1 
ORDER BY `Timestamp` 

替代的解决方案(更有效,我认为)

SELECT t1.`Timestamp`, t1.`Total`, (t1.`Total` - d1.MinVal) diff 
FROM myTable t1 
    INNER JOIN 
    (SELECT DATE(`Timestamp`) ts_date, 
      MIN(`Total`) AS MinVal 
     FROM myTable 
     GROUP BY ts_date) d1 
    ON DATE(t1.`Timestamp`) = d1.ts_date 
+0

谢谢这是非常有用的。第二种解决方案似乎确实是首选解决方案,因为它似乎使用较少的系统资源。 – yjb 2012-08-07 20:03:56