每个增量的运行总计

Posted

技术标签:

【中文标题】每个增量的运行总计【英文标题】:Running total of every increment 【发布时间】:2020-11-10 16:11:30 【问题描述】:

我有一张表events如下:

f_id   leg   
1       1
2       1
3       1
4       2
5       2
6       3
7       1
8       1
9       2

我想要每次leg 更改时的总和。预期输出:

f_id   leg     total_legs   
1       1         1
2       1         1
3       1         1
4       2         2
5       2         2
6       3         3
7       1         4
8       1         4
9       2         5

不知道该怎么做。

SELECT *, @leg_var:=IF(@current_leg=leg, leg) as total_legs FROM `events`

这显然是错误的。

【问题讨论】:

你用的是什么版本的 mysql 使用 MariaDB 10.2 【参考方案1】:
WITH cte AS ( SELECT *, CASE WHEN LAG(leg) OVER (ORDER BY f_id) = leg 
                             THEN 0 
                             ELSE 1 
                             END lag_leg
              FROM test )
SELECT f_id, leg, SUM(lag_leg) OVER (ORDER BY f_id) total_legs
FROM cte;

fiddle

【讨论】:

【参考方案2】:

这是一种孤岛问题。在 MySQL 8.0 中,您可以使用lag() 和累积的sum()

select fid, leg, sum(not leg <=> lag_leg) over(order by f_id) total_legs
from (
    select e.*, lag(leg) over(order by f_id) lag_leg
    from events e
) e

【讨论】:

【参考方案3】:

这个问题可以不用窗口函数使用变量来解决:

SET @leg_var:=null;
SET @total:=0;
SELECT 
    f_id, 
    @leg_var prev_leg, 
    @total:=@total+if(@leg_var is null or @leg_var<>leg, 1, 0) as total,
    @leg_var:=leg as leg
FROM events
ORDER BY f_id;

fiddle here

【讨论】:

以上是关于每个增量的运行总计的主要内容,如果未能解决你的问题,请参考以下文章

反应中的setState增量和每个增量1有啥区别[重复]

AssetBundle增量打包

休眠(mysql)刷新与提交中的自动增量

plist中的增量编号

值数组中每个元素的 PromQL 增量

如何禁用增量修复?