我有一张像这样的桌子:
连接日期 | mat_emp | 休息 |
---|---|---|
2018/2019 届前 | AO-26 | 27.5 |
EX2019/2020 | AO-26 | 30 |
EX2020/2021 | AO-26 | 30 |
EX2021/2022 | AO-26 | 30 |
EX2022/2023 | AO-26 | 30 |
我想要的代码可以减去变量数字,在本例中为 40,我希望它从第一个“其余”列中减去它,并将减去的数量放在新行的开头,名称为“ rest-40”,并将“rest”值替换为该值剩余的数量(如果它低于 0,则将其设置为 0),并且它将从减数中得到剩余的数字(开始时为 40) )并从下一行减去 if 并使用减去的值减去下一行,直到剩余为 0 然后将表格停在那里,如下例所示,我想要相同的结果
休息-40 | 串联 | mat_emp | 休息 |
---|---|---|---|
27.5 | 2018/2019 届前 | AO-26 | 0 |
12.5 | EX2019/2020 | AO-26 | 17.5 |
注意:不要使用更新,因为这不是表,而是视图。
我多次尝试向chatGpt解释它,但没有给我任何满意的结果,这是最接近的结果:
SELECT
LEAST(rest, 40) as subtracted_value,
concatenated_dates,
mat_emp,
GREATEST(rest - 40, 0) as remaining_rest
FROM
your_table
WHERE
rest > 0;
我希望它只从第一行减去 40,然后将剩下的 40 减去到下一行,依此类推,直到结果为 0,然后就完成了
这使用 UDV 来跟踪
rest
的累积和:
SELECT
IF(40 - cum_sum < 0, 40 - (cum_sum - rest), rest) AS `rest-40`,
concatenated_dates,
mat_emp,
(SELECT rest - `rest-40`) AS rest
FROM (
SELECT yt1.*, @cum_sum := @cum_sum + rest AS cum_sum
FROM your_table yt1
JOIN (SELECT @cum_sum := 0) vars
ORDER BY concatenated_dates
) AS cumulative
WHERE cum_sum - rest < 40;
这是一个db<>小提琴。