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 |
+----------+------+------+------+------+
我尝试使 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:我也发现了这个
有人可以帮帮我吗?
谢谢!
样本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 |
+----------+------+------+------+------+