每个增量的运行总计
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
【讨论】:
以上是关于每个增量的运行总计的主要内容,如果未能解决你的问题,请参考以下文章