工厂每天只能处理10个订单。 10个订单后如何提前日期?

时间:2020-03-14 05:01:23

标签: excel powerbi powerquery powerbi-desktop

我正在一个Excel文件中工作,该文件只有两列:“订单号”和“日期”。

如果给定一天的订单超过10个,则超过10个的订单需要“溢出”到下一个工作日。当然,下一个工作日已经有订单。因此,将原始日期移至下一个工作日可能会导致 一天的订单超过10。这是一个递归问题。

我从Power Query开始,使用了一个Index列,该列从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

1 个答案:

答案 0 :(得分:4)

  • 我不确定下面的代码可扩展的程度(例如,如果您有数百万行),但是您可以尝试使用该代码,看看是否能提供预期的输出。 (我认为应该这样做,但是您没有提供表格的示例以及表格的外观,因此我不确定。)
  • 您没有定义“工作日”。我们是否可以无条件假设星期一至星期五,或者是否有应排除的公共假日(可能在星期一至星期五之间包括整个假日)?
  • 下面的代码假定下一个工作日的定义与下一个可用订单日期(在表格本身中)是一样的。但是,使用此定义会带来以下问题:
    • 最后一个订单日期(在表格中显示)是否有可能超过10个订单?
    • 如果是这样,对超出最后一个订单日期的订单应该怎么办?
    • 您的订单日期必须按升序排序(在开始循环搜索之前)。
  • 目前,代码既返回转换后的表,也返回溢出到最后一个可用工作日之外的所有未使用的行。 (然后,您可以选择对它们执行任何操作。)

我认为您的桌子看起来像这样:

Initial 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应该是一个表,其中包含溢出到最后一个可用日期之后的所有行(因此是“未分配的”)。如果没有这样的行(最后一个可用日期),则spilledOver应该是一个空表。
  • result应该是一个表格,其中每个订单日期不得超过10个订单。 (您应该能够通过将result"orderDate"分组,再与Table.RowCount聚合,然后检查是否超过10个来确认这一点。)

很显然,您需要为自己表的列名调整代码。

相关问题