根据上一行中的值计算 MariaDB 中的新值
Calculate new value in MariaDB based on values in the previous row
在 MariaDB 10.3 中,我有一个 table 这样的:
id
date
sum
1
2020-01-01
120
1
2020-02-01
130
1
2020-03-01
140
1
2020-04-01
150
1
2020-05-01
160
1
2020-06-01
170
我需要计算每次约会后的余额。像这样的东西。
我需要在 MariaDB 中作为查询进行计算。
id
date
sum
remaining total sum before pay
1
2020-01-01
120
870
1
2020-02-01
130
750
1
2020-03-01
140
620
1
2020-04-01
150
480
1
2020-05-01
160
330
1
2020-06-01
170
170
我找到了一些接近的解决方案,但无法以适当的方式更改它们以满足我的需要。任何想法将不胜感激。
最后一列的逻辑是:
- 第一个值是所欠的全部金额 (120+130+140...)
- 每个下一个值都是根据该数字减去同一行上总和列中的值计算得出的
即
- 870-120=750;
- 750-130=620;
- 620-140=480;等等
我的尝试是:
- 第一个接近但无效的查询:
SELECT
id,s.sum,s.date,
@b := @b + s.sum AS balance
FROM
(SELECT @b := 0.0) AS dummy
CROSS JOIN
tpp AS s
where id=1
ORDER BY
s.date ;
结果是:
id
date
sum
remaining total sum before pay
1
2020-01-01
120
120
1
2020-02-01
130
250
1
2020-03-01
140
380
1
2020-04-01
150
520
1
2020-05-01
160
670
1
2020-06-01
170
840
即它有点扭转了结果。并增加下一行的值。
- 另一个查询是使用 LAG 函数,但减法部分令人失望
SELECT
id,date,
sum(sum)-LAG(sum) OVER (ORDER BY date) AS l
FROM tpp
where id=1
group by date,id
ORDER BY date
结果:
id
date
remaining total sum before pay
1
2020-01-01
null
1
2020-02-01
10
1
2020-03-01
10
1
2020-04-01
10
1
2020-05-01
10
1
2020-06-01
10
减去:
- 130-120=10;
- 140-130=10;
- 150-140=10;等等
您只需要 SUM() window 函数:
SELECT id, date,
SUM(sum) OVER (ORDER BY date DESC) AS l
FROM tpp
WHERE id = 1
ORDER BY date
参见demo。
结果:
> id | date | l
> -: | :--------- | --:
> 1 | 2020-01-01 | 870
> 1 | 2020-02-01 | 750
> 1 | 2020-03-01 | 620
> 1 | 2020-04-01 | 480
> 1 | 2020-05-01 | 330
> 1 | 2020-06-01 | 170
在 MariaDB 10.3 中,我有一个 table 这样的:
id | date | sum |
---|---|---|
1 | 2020-01-01 | 120 |
1 | 2020-02-01 | 130 |
1 | 2020-03-01 | 140 |
1 | 2020-04-01 | 150 |
1 | 2020-05-01 | 160 |
1 | 2020-06-01 | 170 |
我需要计算每次约会后的余额。像这样的东西。 我需要在 MariaDB 中作为查询进行计算。
id | date | sum | remaining total sum before pay |
---|---|---|---|
1 | 2020-01-01 | 120 | 870 |
1 | 2020-02-01 | 130 | 750 |
1 | 2020-03-01 | 140 | 620 |
1 | 2020-04-01 | 150 | 480 |
1 | 2020-05-01 | 160 | 330 |
1 | 2020-06-01 | 170 | 170 |
我找到了一些接近的解决方案,但无法以适当的方式更改它们以满足我的需要。任何想法将不胜感激。
最后一列的逻辑是:
- 第一个值是所欠的全部金额 (120+130+140...)
- 每个下一个值都是根据该数字减去同一行上总和列中的值计算得出的 即
- 870-120=750;
- 750-130=620;
- 620-140=480;等等
我的尝试是:
- 第一个接近但无效的查询:
SELECT id,s.sum,s.date, @b := @b + s.sum AS balance FROM (SELECT @b := 0.0) AS dummy CROSS JOIN tpp AS s where id=1 ORDER BY s.date ;
结果是:
id | date | sum | remaining total sum before pay |
---|---|---|---|
1 | 2020-01-01 | 120 | 120 |
1 | 2020-02-01 | 130 | 250 |
1 | 2020-03-01 | 140 | 380 |
1 | 2020-04-01 | 150 | 520 |
1 | 2020-05-01 | 160 | 670 |
1 | 2020-06-01 | 170 | 840 |
即它有点扭转了结果。并增加下一行的值。
- 另一个查询是使用 LAG 函数,但减法部分令人失望
SELECT id,date, sum(sum)-LAG(sum) OVER (ORDER BY date) AS l FROM tpp where id=1 group by date,id ORDER BY date
结果:
id | date | remaining total sum before pay |
---|---|---|
1 | 2020-01-01 | null |
1 | 2020-02-01 | 10 |
1 | 2020-03-01 | 10 |
1 | 2020-04-01 | 10 |
1 | 2020-05-01 | 10 |
1 | 2020-06-01 | 10 |
减去:
- 130-120=10;
- 140-130=10;
- 150-140=10;等等
您只需要 SUM() window 函数:
SELECT id, date,
SUM(sum) OVER (ORDER BY date DESC) AS l
FROM tpp
WHERE id = 1
ORDER BY date
参见demo。
结果:
> id | date | l
> -: | :--------- | --:
> 1 | 2020-01-01 | 870
> 1 | 2020-02-01 | 750
> 1 | 2020-03-01 | 620
> 1 | 2020-04-01 | 480
> 1 | 2020-05-01 | 330
> 1 | 2020-06-01 | 170