我需要确定我当前的行值是正值还是负值,它是起始值、计划增加值和每日减少量的函数(取决于前一天的输出值是正值还是负值)。
我只知道第 1 天的起始数字、增加的时间表以及减少的值(正数或负数)。
若“前一天产量”+“今日预定增幅”为正数,则“前一天产量”+“今日预定增幅”- 2(减值) 若“前日产量”+“今日预定增幅”为负数,则“前日产量”+“今日预定增幅”- 1(递减值)
我还没有尝试过任何东西,因为我想不出执行此操作的代数方法。迭代函数或循环的新手。
这是我必须开始的数据:
这是我想结束的:
最佳答案
我相信我有适合您的解决方案。
注意:如果 start_val
为正数 (>= 0
),则将减量设置为 2
但是,在输出示例的 第 11 天
,您将减量设置为 1
,其中 start_val + increase = 0
。
此解决方案将匹配您将 0
视为负数的示例输出。这在设置 new_dec
的段中很容易更改。只需将 =
移动到适当的位置即可。
CREATE OR REPLACE FUNCTION update_vals()
RETURNS SETOF test
AS
$$
DECLARE
new_dec integer;
new_end integer;
new_start integer;
rec record;
BEGIN
FOR rec IN
SELECT * FROM test
LOOP
new_start := NULL::integer;
IF rec.start_val IS NULL
THEN
SELECT end_val
INTO new_start
FROM
(
SELECT MAX(id) last_id FROM test WHERE id < rec.id
) a
JOIN test ON id = a.last_id
;
END IF;
IF COALESCE(rec.start_val, new_start) + rec.increase > 0
THEN
new_dec := 2;
ELSIF COALESCE(rec.start_val, new_start) + rec.increase <= 0
THEN
new_dec := 1;
END IF;
new_end := COALESCE(rec.start_val, new_start) + rec.increase - new_dec;
IF new_start IS NOT NULL
THEN
RETURN QUERY
UPDATE test
SET (start_val, decrement, end_val) = (new_start, new_dec, new_end)
WHERE id = rec.id
RETURNING *
;
ELSE
RETURN QUERY
UPDATE test
SET (decrement, end_val) = (new_dec, new_end)
WHERE id = rec.id
RETURNING *
;
END IF;
END LOOP;
END;
$$ LANGUAGE PLPGSQL;
Here是一个 db-fiddle 来展示一个工作示例。
关于postgresql - 如何编写一个迭代函数,使当前行输出基于先前行输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55768214/