我需要确定我的当前行值是正数还是负值,这是起始值、计划增加和日减少的函数(取决于上一天的输出值是正还是负)。
我只知道第一天的起始数,我的增加时间表,如果是正的还是负的,我的递减值。
如果“日前产出”+“今日计划增加额”为正,则如果“前一天产出”+“今日计划增加额”为负值,则“前一天产出”+“今日计划增加额”-2(递减值),则“前一天产出”+“今日计划增加额”-1(递减值)
我什么都没试过,因为我想不出一种代数的方法来实现这一点。新的迭代函数或循环。
以下是我必须首先处理的数据:

以下是我想结束的内容:

发布于 2019-04-23 15:35:40
我相信我有个解决办法给你。
注意:,您有一个规定,如果start_val是正数(>= 0),则将递减设置为2,但是,在输出示例的Day 11中,将递减设置为1 where 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;这里是一个用来演示工作示例的副手.
https://stackoverflow.com/questions/55768214
复制相似问题