每个增量的运行总计

问题描述

我有一个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`

这显然是错误的。

解决方法

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

,

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

select fid,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
,

不用使用变量的窗口函数就可以解决问题:

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