逐行求和,同时在每个和之后检查约束条件?

时间:2019-04-22 19:00:43

标签: postgresql

这是一个漫长的场景:

我有三个港口,每天生产一定数量的产品,最大容量以公吨为单位。在过去的五年中,我也收到了所有这些港口的货物,其中包括多少公吨货物以及从哪个港口获取的。为了便于说明,我将使用更短的时间。

示例数据,端口:

port    capacity    daily_prod
qatar   250000      50000
russia  150000      20000
mexico  25000       7000

到达:

vessel_id  port    date        metric_tons
1          russia  04/02/2019  45000
40         russia  04/08/2019  40000
11         qatar   04/01/2019  40000
2          qatar   04/02/2019  50000
9          qatar   04/06/2019  40000
14         qatar   04/06/2019  60000
15         qatar   04/08/2019  40000

以示例为重点,从04/01/2019到04/08/2019。

我想要做的是找到当前港口的公吨数量。但是这里的限制是端口的数量在任何给定的时间都不能超过端口的容量,也永远不能低于零(如果是的话,我们假设其他地方的产品数量未知)上船)。

例如;在2019年4月2日,俄罗斯的一艘船载货45000,尽管我们当时的数字告诉我们它只有40000(2天的生产,每天20000的产量)。因此它必须抓住这一点并将其放回零,以便如果我们在04/03/2019检查容量的产品数量,它将表示20,000(40000-45000变为零,然后每天的生产量增加20,000 )。

另一方面,墨西哥的产量将最大化并保持在那里。在04/08/2019进行检查时,我们应该看到25000。

卡塔尔应考虑到两艘船在同一天装载的情况,并在向前移动之前从当时的载重量中正确减去。

预期的最终结果将在新表中如下所示:

port     capacity      daily_prod        current_inv (on 04/08/2019)
qatar    250000        50000             210000
russia   150000        20000             80000
mexico   25000         7000              25000

我知道如何求和,但是求和在这里不起作用。感觉像我需要的是某种滚动总和,每次将两个值按顺序求和后都会不断检查约束。我将如何去做?

创建表的代码:

create table test_ports (port text, capacity int, daily_prod int);

insert into test_ports values ('qatar', 250000, 50000),('russia', 150000, 20000), ('mexico', 25000, 7000);

create table test_arrivals (vessel int, port text, "date" date, metric_tons int) ;

insert into test_arrivals values (1, 'russia', '04/02/2019', 45000), (40, 'russia', '04/08/2019', 40000), (1, 'qatar', '04/01/2019',40000),
(2, 'qatar', '04/02/2019', 50000), (9, 'qatar', '04/06/2019', 40000), (14, 'qatar', '04/06/2019', 60000), (14, 'qatar', '04/08/2019', 40000);

0 个答案:

没有答案