这是一个漫长的场景:
我有三个港口,每天生产一定数量的产品,最大容量以公吨为单位。在过去的五年中,我也收到了所有这些港口的货物,其中包括多少公吨货物以及从哪个港口获取的。为了便于说明,我将使用更短的时间。
示例数据,端口:
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);