问题描述
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;
,
这是种空白与孤岛的问题。在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;