如何计算 MySQL table 中前一行和当前行值的 SUM?
How to calulate SUM previous and current row value in MySQL table?
我的 table 是 "Activity_table",它有 4 列。我如何创建一个函数,对每个 Peroson 2 以前和当前的活动求和?
我的 Activity_table
ID PID AID Act
1 1 1 12
2 1 2 32
3 2 1 5
4 1 3 21
5 2 2 12
6 2 3 19
7 1 4 11
8 2 4 6
PID-人物ID; AID-活动ID;活动价值
我的目标:
ID PID AID Act SUM
1 1 1 12 12
2 1 2 32 44
3 2 1 5 5
4 1 3 21 65
5 2 2 12 17
6 2 3 19 36
7 1 4 11 64
8 2 4 6 37
总和1=12; Sum2=32+12;总和3=5; Sum4=21+32+12; Sum5=12+5; Sum6=19+12+5; Sum7=11+21+32; Sum8=6+19+12;谢谢,
你是根据PID取SUM对吧?然后你的目标的最后两行应该修改为,
7 1 4 11 **76**
8 2 4 6 **42**
最符合您要求的查询是,
SELECT ID,PID,AID,Act,
(SELECT SUM(Act)
FROM Activity_table
WHERE ID <= a.ID
AND PID = a.PID)
FROM Activity_table a;
那如果你只需要某个PID的SUM的流量,可以这样改,
SELECT ID,PID,AID,Act,
(SELECT SUM(Act)
FROM Activity_table
WHERE ID <= a.ID
AND PID = a.PID)
FROM Activity_table a
WHERE PID = 2;
结果:
ID PID AID Act SUM
3 2 1 5 5
5 2 2 12 17
6 2 3 19 36
8 2 4 6 42
要使用前两行和当前行,
SELECT ID,PID,AID,Act,
(SELECT SUM(Act)
FROM Activity_table
WHERE ID <= a.ID
AND ID >= a.ID - 2
AND PID = a.PID)
FROM Activity_table a;
抱歉之前错误的回答(已删除)。
这会根据您的示例生成正确答案:
SET @LastPID = 0, @Act1 = 0,@Act2 = 0,@Act3 = 0;
SELECT ID,PID,AID,Act,`SUM` FROM
(
SELECT ID,PID,AID,Act,@Act3 := IF(@LastPID != PID, 0,@Act2),@Act2 := IF(@LastPID != PID, 0,@Act1), @Act1 := Act, @Act1 + @Act2 + @Act3 `SUM`, @LastPID := PID
FROM Activity_table
ORDER BY PID,ID
) sm
ORDER BY ID
;
我的 table 是 "Activity_table",它有 4 列。我如何创建一个函数,对每个 Peroson 2 以前和当前的活动求和? 我的 Activity_table
ID PID AID Act
1 1 1 12
2 1 2 32
3 2 1 5
4 1 3 21
5 2 2 12
6 2 3 19
7 1 4 11
8 2 4 6
PID-人物ID; AID-活动ID;活动价值
我的目标:
ID PID AID Act SUM
1 1 1 12 12
2 1 2 32 44
3 2 1 5 5
4 1 3 21 65
5 2 2 12 17
6 2 3 19 36
7 1 4 11 64
8 2 4 6 37
总和1=12; Sum2=32+12;总和3=5; Sum4=21+32+12; Sum5=12+5; Sum6=19+12+5; Sum7=11+21+32; Sum8=6+19+12;谢谢,
你是根据PID取SUM对吧?然后你的目标的最后两行应该修改为,
7 1 4 11 **76**
8 2 4 6 **42**
最符合您要求的查询是,
SELECT ID,PID,AID,Act,
(SELECT SUM(Act)
FROM Activity_table
WHERE ID <= a.ID
AND PID = a.PID)
FROM Activity_table a;
那如果你只需要某个PID的SUM的流量,可以这样改,
SELECT ID,PID,AID,Act,
(SELECT SUM(Act)
FROM Activity_table
WHERE ID <= a.ID
AND PID = a.PID)
FROM Activity_table a
WHERE PID = 2;
结果:
ID PID AID Act SUM
3 2 1 5 5
5 2 2 12 17
6 2 3 19 36
8 2 4 6 42
要使用前两行和当前行,
SELECT ID,PID,AID,Act,
(SELECT SUM(Act)
FROM Activity_table
WHERE ID <= a.ID
AND ID >= a.ID - 2
AND PID = a.PID)
FROM Activity_table a;
抱歉之前错误的回答(已删除)。 这会根据您的示例生成正确答案:
SET @LastPID = 0, @Act1 = 0,@Act2 = 0,@Act3 = 0;
SELECT ID,PID,AID,Act,`SUM` FROM
(
SELECT ID,PID,AID,Act,@Act3 := IF(@LastPID != PID, 0,@Act2),@Act2 := IF(@LastPID != PID, 0,@Act1), @Act1 := Act, @Act1 + @Act2 + @Act3 `SUM`, @LastPID := PID
FROM Activity_table
ORDER BY PID,ID
) sm
ORDER BY ID
;