MySQL中每三行的总和

时间:2017-09-02 05:41:53

标签: mysql sum rows

我有这个MySQL表:

| id | datetime           | readings | phase    
| 1  | 2017-09-01 20:38:45| 5        | 1 
| 2  | 2017-09-01 20:38:45| 5        | 2
| 3  | 2017-09-01 20:38:45| 5        | 3
| 4  | 2017-09-01 20:39:28| 4        | 1 
| 5  | 2017-09-01 20:39:28| 3        | 2
| 6  | 2017-09-01 20:39:28| 4        | 3

这些数据来自能量监测,因此每个读数都有三行,分别为第一阶段,第二阶段和第三阶段。总和或这三个读数应该是我的能量使用时间。

我想得到每三行的总和,其中每一行的相同日期和三个阶段的总和。

所以在这种情况下,我想从MySQL收到日期和总和" (5 + 5 + 5),(4 + 3 + 4)..

类似的东西:

| datetime           | readings_sum    
| 2017-09-01 20:38:45|    15       
| 2017-09-01 20:39:28|    11    

1 个答案:

答案 0 :(得分:1)

由于每个读数都有3行/相,并且假设每个阶段都以1开始,那么您可以使用变量分配块编号,然后分组以对读数求和。如果您希望块中的第一个或最后一个日期时间使用最小值或最大值

CREATE TABLE T (id INT, DT datetime, readings INT, phase INT);
INSERT INTO T VALUES    
( 1 ,  '2017-09-01 20:38:45' ,5        , 1), 
( 2 ,  '2017-09-01 20:38:45' ,5        , 2),
( 3 ,  '2017-09-01 20:38:47' ,5        , 3),
( 4 ,  '2017-09-01 20:39:28' ,4        , 1),
( 5 ,  '2017-09-01 20:39:28' ,3        , 2),
( 6 ,  '2017-09-01 20:39:28' ,4        , 3);

    SELECT s.phaseblock,max(S.DT),SUM(S.READINGS) SumReadings
FROM
(
SELECT T.*,
         IF(T.PHASE = 1 , @BN:=@BN+1,@BN:=@BN) AS PHASEBLOCK,
         @P:=T.PHASE AS P
FROM T ,(SELECT @BN:=0,@P:=0) BLOCK
ORDER BY T.ID
) S
GROUP BY S.PHASEBLOCK; 

结果

+------------+---------------------+-------------+
| phaseblock | max(S.DT)           | SumReadings |
+------------+---------------------+-------------+
| 1          | 2017-09-01 20:38:47 |          15 |
| 2          | 2017-09-01 20:39:28 |          11 |
+------------+---------------------+-------------+
2 rows in set (0.08 sec)