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中每三行的总和的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql中选择前三行

如何在 MySQL 中每列插入数据数组?

如何获得前三行的总和,然后是新列中的下三行

mysql中如何设置一个字段,表中每增加一个值,这个字段自动产生一个连续的序号?

获取水晶报表中每页字段的总和

mysql查询某段时间段中每一天的数据