工厂每天只能处理 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,它有两个字段:spilledOverresult,其中:

  • spilledOver 应该是一个 table 包含超出最后可用日期的任何行(因此是 "unassigned")。如果没有这样的行(对于最后一个可用日期),spilledOver 应该是空的 table.
  • result 应该是 table 其中每个订单日期不应超过 10 个订单。 (您应该能够通过 result"orderDate" 分组并按 Table.RowCount 聚合来确认这一点,然后检查是否有超过 10 个。)

显然,您需要调整您自己的 table 列名称的代码。