工厂每天只能处理 10 个订单。如何在 10 个订单后将日期提前?
Factory can only process 10 orders per day. How to push dates ahead after 10 orders?
我正在处理一个只有两列的 Excel 文件:"Order Number" 和 "Date."
如果一天的订单超过10个,超过10个的订单需要"spill"到下一个工作日。当然,下一个工作日已经有订单了。所以把原来的日期移到下一个工作日可能会使那天的订单超过10个。这是一个递归问题。
我从 Power Query 开始,并使用了一个索引列,该列从 0 开始,并为每组 10 个订单号重置为 0。然后添加了一个带有 Date.Add([Date],[Index]) 的自定义列。然后我尝试了 Mod() 和其他一些失败。
答案似乎需要知道一行是否超过 10 个订单并且知道已经调整的日期(如果超过 10 个已经发生在更早的时候。)
又是递归的感觉。
我在 Power Query 中获得了一些真正的胜利,这是我在现实世界中的第一个令人头疼的问题。
数据:
Order Number Date
1 1/1/2020
2 1/1/2020
3 1/1/2020
...
10 1/1/2020
11 1/1/2020
12 1/1/2020
13 1/2/1020
14 1/2/2020
预期输出:
Order Number Date
1 1/1/2020
2 1/1/2020
3 1/1/2020
...
10 1/1/2020
11 1/2/2020
12 1/2/2020
13 1/2/1020
14 1/2/2020
...
20 1/2/2020
21 1/3/2020
22 1/3/2020
- 我不确定下面的代码的扩展性如何(假设您有数百万行),但您可以尝试该代码并查看它是否提供预期的输出。 (我认为应该,但是你没有给出你的 table 的例子以及它应该是什么样子,所以我不能确定。)
- 您没有定义 "working day"。我们可以无条件地假设周一至周五,还是应该排除 public 假期(可能包括周一和周五)?
- 下面的代码假定下一个工作日的定义是下一个可用订单日期(在 table 本身)。但是,使用此定义会引入以下问题:
- 最后一个订单日期(在 table 中)是否有可能超过 10 个订单?
- 如果是这样,对于超出最后订单日期的订单应该如何处理?
- 您的订单日期必须按升序排序(在开始循环之前)。
- 现在,代码 returns 转换后的 table 和在最后一个可用工作日之后溢出的任何未使用的行。 (然后你可以选择对它们做任何你想做的事。)
我假设你的 table 看起来像:
和下面的代码:
let
initialTable =
let
listsOfDates = List.Transform({1..20}, each List.Dates(#date(2020, 1, 1), _, #duration(1, 0, 0, 0))),
combined = List.Combine(listsOfDates),
dateColumn = Table.FromColumns({List.Sort(combined)}, type table [orderDate = date]),
orderNumberColumn = Table.AddColumn(dateColumn, "orderNumber", each Text.NewGuid(), type text)
in orderNumberColumn,
grouped = Table.Group(initialTable, "orderDate", {"nested", each _, type table}),
emptyTable = Table.FirstN(initialTable, 0),
accumulated = List.Accumulate(
List.Buffer(Table.ToRecords(grouped)),
[
spilledOver = emptyTable,
result = emptyTable
],
(state as record, row as record) =>
let
MAX_ROW_COUNT = 10,
currentDate = row[orderDate],
currentTable = Table.TransformColumns(state[spilledOver], {"orderDate", each currentDate, type date}) & row[nested],
shouldSpillOver = Table.RowCount(currentTable) > MAX_ROW_COUNT,
appended = state[result] & Table.FirstN(currentTable, MAX_ROW_COUNT),
newState = if shouldSpillOver then
[spilledOver = Table.Skip(currentTable, MAX_ROW_COUNT), result = appended]
else
[spilledOver = emptyTable, result = appended]
in newState
),
result = accumulated[result]
in
result
应该给你一个record
,它有两个字段:spilledOver
和result
,其中:
spilledOver
应该是一个 table 包含超出最后可用日期的任何行(因此是 "unassigned")。如果没有这样的行(对于最后一个可用日期),spilledOver
应该是空的 table.
result
应该是 table 其中每个订单日期不应超过 10 个订单。 (您应该能够通过 result
按 "orderDate"
分组并按 Table.RowCount
聚合来确认这一点,然后检查是否有超过 10 个。)
显然,您需要调整您自己的 table 列名称的代码。
我正在处理一个只有两列的 Excel 文件:"Order Number" 和 "Date."
如果一天的订单超过10个,超过10个的订单需要"spill"到下一个工作日。当然,下一个工作日已经有订单了。所以把原来的日期移到下一个工作日可能会使那天的订单超过10个。这是一个递归问题。
我从 Power Query 开始,并使用了一个索引列,该列从 0 开始,并为每组 10 个订单号重置为 0。然后添加了一个带有 Date.Add([Date],[Index]) 的自定义列。然后我尝试了 Mod() 和其他一些失败。
答案似乎需要知道一行是否超过 10 个订单并且知道已经调整的日期(如果超过 10 个已经发生在更早的时候。)
又是递归的感觉。
我在 Power Query 中获得了一些真正的胜利,这是我在现实世界中的第一个令人头疼的问题。
数据:
Order Number Date
1 1/1/2020
2 1/1/2020
3 1/1/2020
...
10 1/1/2020
11 1/1/2020
12 1/1/2020
13 1/2/1020
14 1/2/2020
预期输出:
Order Number Date
1 1/1/2020
2 1/1/2020
3 1/1/2020
...
10 1/1/2020
11 1/2/2020
12 1/2/2020
13 1/2/1020
14 1/2/2020
...
20 1/2/2020
21 1/3/2020
22 1/3/2020
- 我不确定下面的代码的扩展性如何(假设您有数百万行),但您可以尝试该代码并查看它是否提供预期的输出。 (我认为应该,但是你没有给出你的 table 的例子以及它应该是什么样子,所以我不能确定。)
- 您没有定义 "working day"。我们可以无条件地假设周一至周五,还是应该排除 public 假期(可能包括周一和周五)?
- 下面的代码假定下一个工作日的定义是下一个可用订单日期(在 table 本身)。但是,使用此定义会引入以下问题:
- 最后一个订单日期(在 table 中)是否有可能超过 10 个订单?
- 如果是这样,对于超出最后订单日期的订单应该如何处理?
- 您的订单日期必须按升序排序(在开始循环之前)。
- 现在,代码 returns 转换后的 table 和在最后一个可用工作日之后溢出的任何未使用的行。 (然后你可以选择对它们做任何你想做的事。)
我假设你的 table 看起来像:
和下面的代码:
let
initialTable =
let
listsOfDates = List.Transform({1..20}, each List.Dates(#date(2020, 1, 1), _, #duration(1, 0, 0, 0))),
combined = List.Combine(listsOfDates),
dateColumn = Table.FromColumns({List.Sort(combined)}, type table [orderDate = date]),
orderNumberColumn = Table.AddColumn(dateColumn, "orderNumber", each Text.NewGuid(), type text)
in orderNumberColumn,
grouped = Table.Group(initialTable, "orderDate", {"nested", each _, type table}),
emptyTable = Table.FirstN(initialTable, 0),
accumulated = List.Accumulate(
List.Buffer(Table.ToRecords(grouped)),
[
spilledOver = emptyTable,
result = emptyTable
],
(state as record, row as record) =>
let
MAX_ROW_COUNT = 10,
currentDate = row[orderDate],
currentTable = Table.TransformColumns(state[spilledOver], {"orderDate", each currentDate, type date}) & row[nested],
shouldSpillOver = Table.RowCount(currentTable) > MAX_ROW_COUNT,
appended = state[result] & Table.FirstN(currentTable, MAX_ROW_COUNT),
newState = if shouldSpillOver then
[spilledOver = Table.Skip(currentTable, MAX_ROW_COUNT), result = appended]
else
[spilledOver = emptyTable, result = appended]
in newState
),
result = accumulated[result]
in
result
应该给你一个record
,它有两个字段:spilledOver
和result
,其中:
spilledOver
应该是一个 table 包含超出最后可用日期的任何行(因此是 "unassigned")。如果没有这样的行(对于最后一个可用日期),spilledOver
应该是空的 table.result
应该是 table 其中每个订单日期不应超过 10 个订单。 (您应该能够通过result
按"orderDate"
分组并按Table.RowCount
聚合来确认这一点,然后检查是否有超过 10 个。)
显然,您需要调整您自己的 table 列名称的代码。