查询计算到第二天的剩余单位

问题描述 投票:0回答:1

上下文:我有一个包含 3 列的表:“day”、“arrivals”、“max_output_capacity”。

表格基本上是这样的:

抵达 最大输出容量
0 0 2
1 2 3
2 5 4
3 0 5
4 0 5
5 14 1
6 0 3

到达是每天到达商店的单位(包裹)。这些单位最好在当天发送到目的地。

大多数情况下,每天的

最大输出容量足以发送当天的所有包裹,但有时到达的数量会大于最大输出容量。发生这种情况时,还有剩余数量的包裹需要在第二天或后一天发送(如果当天没有发送完所有包裹)等等,具体取决于仍有多少单位尚未发送。

我想计算每天的剩余单位。

在 Excel 电子表格中,这很容易做到。剩下的字段是

剩余下一个天 [ti] = [0] 和 [到达数量 - 最大输出容量 + 剩余下一个天[t_i-1]] 之间的最大值

(第一天就处理了异常)

此公式给出以下结果:

日抵达最大输出容量剩余下一天0020123025413050405051411360310
因此,我需要使用 SQL 查询来填充最后一列。

我已经尝试了一切,chatGPT、教程、LAG 功能等。过去 6 天到目前为止,还没有成功。

任何帮助或建议将不胜感激。

我使用
MS Access 作为我的第一选择。但我也可以使用 SQLite

这看起来很简单,但棘手的部分是递归性恕我直言。

我的设置代码是:

CREATE TABLE process_table(day, arrivals, max_output_capacity)


INSERT INTO process_table VALUES ('0', 0, 2), ('1', 2, 3), ('2', 5, 4), ('3', 0, 5), ('4', 0, 5), ('5', 14, 1), ('6', 0, 3)


干杯

我尝试了不同的查询,例如:

WITH AccumulatedRemaining AS ( SELECT day, arrivals, max_output_capacity, IIf( arrivals > max_output_capacity, arrivals - max_output_capacity, 0 ) AS current_day_remaining, IIf( arrivals > max_output_capacity, arrivals - max_output_capacity, 0 ) AS acumulated_remaining FROM process_table ORDER BY day ), NextDayRemaining AS ( SELECT r1.day, r1.arrivals, r1.max_output_capacity, r1.current_day_remaining, IIf( r1.acumulated_remaining + r2.current_day_remaining > r1.max_output_capacity, r1.acumulated_remaining + r2.current_day_remaining - r1.max_output_capacity, 0 ) AS remaining_next_day FROM AccumulatedRemaining AS r1 LEFT JOIN AccumulatedRemaining AS r2 ON r2.day = r1.day + 1 ) SELECT day, arrivals, max_output_capacity, current_day_remaining, remaining_next_day FROM NextDayRemaining ORDER BY day;
    
sqlite
1个回答
0
投票
我相信以下可能是解决方案:-

WITH cte_1 AS ( SELECT *, max(arrivals-max_output_capacity,0) AS remaining_next_day FROM process_table ), cte_2 AS ( SELECT *, coalesce( ( SELECT remaining_next_day FROM cte_1 AS c1 WHERE c1.day < c2.day ORDER BY day DESC LIMIT 1 ) ,0) AS carried_over FROM cte_1 AS c2 ) SELECT day,arrivals,carried_over,max_output_capacity, max(arrivals + carried_over - max_output_capacity,0) AS remaining_next_day FROM cte_2;
以下演示:-

DROP TABLE IF EXISTS process_table; CREATE TABLE IF NOT EXISTS process_table(day, arrivals, max_output_capacity); INSERT INTO process_table VALUES ('0', 0, 2), ('1', 2, 3), ('2', 5, 4), ('3', 0, 5), ('4', 0, 5), ('5', 14, 1), ('6', 0, 3); WITH cte_1 AS ( SELECT *, max(arrivals-max_output_capacity,0) AS remaining_next_day FROM process_table ), cte_2 AS ( SELECT *, coalesce( ( SELECT remaining_next_day FROM cte_1 AS c1 WHERE c1.day < c2.day ORDER BY day DESC LIMIT 1 ) ,0) AS carried_over FROM cte_1 AS c2 ) SELECT day,arrivals,carried_over,max_output_capacity, max(arrivals + carried_over - max_output_capacity,0) AS remaining_next_day FROM cte_2; /* Cleanup Demo Environment */ DROP TABLE IF EXISTS process_table;
结果:-

© www.soinside.com 2019 - 2024. All rights reserved.