postgresql - 如何编写一个迭代函数,使当前行输出基于先前行输出?

标签 postgresql

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

我只知道第 1 天的起始数字、增加的时间表以及减少的值(正数或负数)。

若“前一天产量”+“今日预定增幅”为正数,则“前一天产量”+“今日预定增幅”- 2(减值) 若“前日产量”+“今日预定增幅”为负数,则“前日产量”+“今日预定增幅”- 1(递减值)

我还没有尝试过任何东西,因为我想不出执行此操作的代数方法。迭代函数或循环的新手。

这是我必须开始的数据:

enter image description here

这是我想结束的:

enter image description here

最佳答案

我相信我有适合您的解决方案。

注意:如果 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/

相关文章:

python - 无法使用 django + nginx 上传媒体文件

postgresql - 动态查询postgres

postgresql - Postgres 解释计划不同

Postgresql Windows 服务器 ssl 压缩不起作用

java - 如何根据给定模式重新排列列表中的项目?

sql - 优化的 sql 查询以计算不同表中具有来自同一用户的评论的产品

java - 如何在 hbm.xml 中映射 Hibernate 中的整数数组

PostgreSQL 使用 pg_trgm 比全扫描慢

r - 在 RHEL 6.5 上安装 RPostgreSQL libpq-fe.h 报错

sql - 基于 hstore 键的动态 INSERT 语句