我有这个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
答案 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)