Postgresql 如何编写一个迭代函数,将当前行输出与前一行输出相比较?
我需要确定当前行值是正值还是负值,这是起始值、计划增加值和每日减少值的函数,这取决于前一天的输出值是正值还是负值 我只知道我第一天的起始数字,我的增加时间表,以及我的递减值(如果是正值或负值) 如果前一天输出+今天计划增加为正值,则前一天输出+今天计划增加-2减少值 如果前一天输出+今天计划增加为负,则前一天输出+今天计划增加-1减少值 我什么都没试过,因为我想不出一个代数方法来实现这一点。新的迭代函数或循环 以下是我必须从以下数据开始: 以下是我想结束的内容:Postgresql 如何编写一个迭代函数,将当前行输出与前一行输出相比较?,postgresql,Postgresql,我需要确定当前行值是正值还是负值,这是起始值、计划增加值和每日减少值的函数,这取决于前一天的输出值是正值还是负值 我只知道我第一天的起始数字,我的增加时间表,以及我的递减值(如果是正值或负值) 如果前一天输出+今天计划增加为正值,则前一天输出+今天计划增加-2减少值 如果前一天输出+今天计划增加为负,则前一天输出+今天计划增加-1减少值 我什么都没试过,因为我想不出一个代数方法来实现这一点。新的迭代函数或循环 以下是我必须从以下数据开始: 以下是我想结束的内容: 我相信我有一个解决办法给你 注意
我相信我有一个解决办法给你 注意:您有一条规定,如果开始值为正>=0,则将减量设置为2,但在输出示例的第11天,您将减量设置为1,其中开始值+增加值=0 此解决方案将匹配您认为0为负值的示例输出。这在设置新参数的段中很容易更改。只需将=移动到适当的位置
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;
是一个db提琴,用于显示工作示例。窗口函数可能有助于了解您要查找的内容。有点难说-如果您可以添加数据样本以及您希望实现的目标,这会有所帮助。您能否提供一个显示您期望的数据集?谢谢-很抱歉,我以前不知道如何粘贴图像。希望这有助于解释我想做什么。你找到解决这个问题的方法了吗?很抱歉,回复太晚了。我有一个人说他可以用Python做这件事,没有问题。可伸缩性是一个问题,使用该方法运行所有数据需要16个多小时。我刚刚开始使用这个解决方案,它在小数据集的第一次测试中非常有效!使用更大的数据集1m+行测试它,并查看它的可扩展性和运行速度。在.PS之后,我将再次跟进。db fiddle对我理解您提供的代码有很大帮助,谢谢!不客气。这似乎是pandas库在python中可以做得很好的事情。也许比postgres本身更好,所以我对这个解决方案的结果很好奇。