mysql 中前几行的总和

Sum of previous rows in mysql

我尝试使 Create a Cumulative Sum Column in MySQL 中的所有内容适应我正在做的事情,但我似乎无法做到正确。我是 MySQL 和 whosebug.com 的新手。我的 table 如下例所示。我需要根据时间在每个 (1, 2, 3) 列中放置 AR 列的前几行的总和。因此,在“1”列中,我必须放置所有先前 AR 单元格的总和,但仅当时间 = 01:00 时,在“2”列中,我必须放置所有先前 AR 单元格的总和,但仅当时间=02:00 等等。每个 (1, 2, 3) 列中的其他单元格应保持为 0.00000。

我的问题是我找不到正确的语法,考虑到我无法从发布在指定主题上的示例中找到替换“id”的方法。

LE:我也发现了这个 但我不知道我应该在其中更改什么才能获得所需的结果。我根本不明白每个符号的来源(例如:r.row1、t2.row1、requete r2、cumesum 等)

有人可以帮帮我吗?

谢谢!

样本table:

| Time | AR | 1 | 2 | 3 |
|:-----|:---|:--|:--|:--|
|00:00 |0.12|0  |0  |0  |
|01:00 |0.16|0  |0  |0  |
|02:00 |0.13|0  |0  |0  |
|03:00 |0.19|0  |0  |0  |
|04:00 |0.11|0  |0  |0  |
|00:00 |0.15|0  |0  |0  |
|01:00 |0.34|0  |0  |0  |
|02:00 |0.56|0  |0  |0  |
|03:00 |0.67|0  |0  |0  |
|04:00 |0.92|0  |0  |0  |

想要table:

| Time | AR | 1       | 2       | 3       |
|:-----|:---|:--------|:--------|:--------|
|00:00 |0.12|0        |0        |0        |
|01:00 |0.16|0.16     |0        |0        |
|02:00 |0.13|0        |0.13     |0        |
|03:00 |0.19|0        |0        |0.19     |
|04:00 |0.11|0        |0        |0        |
|00:00 |0.15|0        |0        |0        |
|01:00 |0.34|0.16+0.34|0        |0        |
|02:00 |0.56|0        |0.13+0.56|0        |
|03:00 |0.67|0        |0        |0.19+0.67|
|04:00 |0.92|0        |0        |0        |

首先,向 table 添加一个唯一列,然后您可以使用您找到的相同 sql 语法。

例如,添加ID列(主键,自增)

+----+----------+------+
| ID | Time     | AR   |
+----+----------+------+
|  1 | 00:00:00 | 0.12 |
|  2 | 01:00:00 | 0.16 |
|  3 | 02:00:00 | 0.13 |
|  4 | 03:00:00 | 0.19 |
|  5 | 04:00:00 | 0.11 |
|  6 | 00:00:00 | 0.15 |
|  7 | 01:00:00 | 0.34 |
|  8 | 02:00:00 | 0.56 |
|  9 | 03:00:00 | 0.67 |
| 10 | 04:00:00 | 0.92 |
+----+----------+------+

SQL:

set @arsum_1 := 0;
set @arsum_2 := 0;
set @arsum_3 := 0;

select t.Time, t.AR, ROUND(IFNULL(t1.A1, 0),2) as `1`, ROUND(IFNULL(t2.A2, 0), 2) as `2`, ROUND(IFNULL(t3.A3, 0),2) as `3` from time_sample t 
natural left join (select ID,  @arsum_1 := @arsum_1 + AR as A1 from time_sample where Time='01:00') as t1 
natural left join (select ID, @arsum_2 := @arsum_2 + AR as A2 from time_sample where Time='02:00') as t2 
natural left join (select ID, @arsum_3 := @arsum_3 + AR as A3 from time_sample where Time='03:00') as t3 order by t.Time;

输出:

+----------+------+------+------+------+
| Time     | AR   | 1    | 2    | 3    |
+----------+------+------+------+------+
| 00:00:00 | 0.12 | 0.00 | 0.00 | 0.00 |
| 00:00:00 | 0.15 | 0.00 | 0.00 | 0.00 |
| 01:00:00 | 0.16 | 0.16 | 0.00 | 0.00 |
| 01:00:00 | 0.34 | 0.50 | 0.00 | 0.00 |
| 02:00:00 | 0.13 | 0.00 | 0.13 | 0.00 |
| 02:00:00 | 0.56 | 0.00 | 0.69 | 0.00 |
| 03:00:00 | 0.19 | 0.00 | 0.00 | 0.19 |
| 03:00:00 | 0.67 | 0.00 | 0.00 | 0.86 |
| 04:00:00 | 0.11 | 0.00 | 0.00 | 0.00 |
| 04:00:00 | 0.92 | 0.00 | 0.00 | 0.00 |
+----------+------+------+------+------+