Postgresql 如何编写一个迭代函数,将当前行输出与前一行输出相比较?

Postgresql 如何编写一个迭代函数,将当前行输出与前一行输出相比较?,postgresql,Postgresql,我需要确定当前行值是正值还是负值,这是起始值、计划增加值和每日减少值的函数,这取决于前一天的输出值是正值还是负值 我只知道我第一天的起始数字,我的增加时间表,以及我的递减值(如果是正值或负值) 如果前一天输出+今天计划增加为正值,则前一天输出+今天计划增加-2减少值 如果前一天输出+今天计划增加为负,则前一天输出+今天计划增加-1减少值 我什么都没试过,因为我想不出一个代数方法来实现这一点。新的迭代函数或循环 以下是我必须从以下数据开始: 以下是我想结束的内容: 我相信我有一个解决办法给你 注意

我需要确定当前行值是正值还是负值,这是起始值、计划增加值和每日减少值的函数,这取决于前一天的输出值是正值还是负值

我只知道我第一天的起始数字,我的增加时间表,以及我的递减值(如果是正值或负值)

如果前一天输出+今天计划增加为正值,则前一天输出+今天计划增加-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本身更好,所以我对这个解决方案的结果很好奇。