上下文:我有一个包含 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]] 之间的最大值
(第一天就处理了异常)此公式给出以下结果:
我已经尝试了一切,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;
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;
结果:-