如何在 mysql 5.7 中使用 sum over partition(没有 window 函数)

How to use sum over partition (withhout window function) in mysql 5.7

我想知道 mysql 5.7 引擎如何与部分求和相同。 不能更换查询引擎,因为不是个人操作。

曾尝试通过@set变量函数来解决,但我发现很难得到四列每一列的累加和。

看了下面的link,还是有点难解决。 how to rank over partition in MySql

我的table

id      a      b     c     d
----------------------------
abs     1      0     0     1
abs     0      1     1     0
abs     1      0     1     0
abs     1      1     1     1
qwe     0      0     0     0
qwe     0      0     0     1
qwe     1      0     1     0
qwe     1      1     0     1
trx     0      1     1     0
trx     1      1     0     0

预计

id      a      b     c     d
----------------------------
abs     1      0     0     1
abs     1      1     1     1
abs     2      1     2     1
abs     3      2     3     2
qwe     0      0     0     0
qwe     0      0     0     1
qwe     1      0     1     1
qwe     2      1     1     2
trx     0      1     1     0
trx     1      2     1     0

提前致谢。

您需要每一列的累计总和。为了使其工作,您需要一个指定顺序的列 - SQL 表代表 无序 集。

假设您有这样一个专栏,那么通常可以使用以下方法:

select t.*,
       (@a := if(@id = id, @a + a, 0)) as a,
       (@b := if(@id = id, @b + b, 0)) as b,
       (@c := if(@id = id, @c + c, 0)) as c,
       (@d := if(@id = id, @d + d, 0)) as d,
       @id := id
from (select t.*
      from t
      order by t.id, ?  -- column for the ordering
     ) t cross join
     (select @id := -1, @a := 0, @b := 0, @c := 0 @d := 0) params;

但是,这 不能保证 工作,因为 MySQL 不保证 SELECT 中表达式的计算顺序。所以,我认为子查询可能是最简单的方法:

select t.id,
       (select sum(t2.a) from t t2 where t2.id = t.id and t2.? <= t.?) as a,
       (select sum(t2.b) from t t2 where t2.id = t.id and t2.? <= t.?) as b,
       (select sum(t2.c) from t t2 where t2.id = t.id and t2.? <= t.?) as c,
       (select sum(t2.d) from t t2 where t2.id = t.id and t2.? <= t.?) as d
from t;