MySQL中每三行的总和
Posted
技术标签:
【中文标题】MySQL中每三行的总和【英文标题】:Sum of every three rows in MySQL 【发布时间】:2017-09-02 05:41:53 【问题描述】:我有这个 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
【问题讨论】:
如果每个组都有相同的datetime
,那么你可以简单地使用:SELECT datetime, SUM(readings) FROM mytable GROUP BY datetime
How to SUM from MySQL for every n record的可能重复
如果日期时间不同,您是否关心您在结果集中得到哪个?
三个阶段的数据时间总是相同的,我需要读数来制作能源使用图表。所以我需要基于 X 的日期时间和基于 Y 的能量。当然图表不是问题的一部分。
【参考方案1】:
由于每个读数都有 3 行/阶段,并且假设每个阶段都以 1 开头,那么您可以使用变量分配块编号,然后按分组对读数求和。如果您想要块中的第一个或最后一个日期时间,请使用 min 或 max。
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)
【讨论】:
谢谢,我去看看以上是关于MySQL中每三行的总和的主要内容,如果未能解决你的问题,请参考以下文章