我正在一个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
答案 0 :(得分:4)
我认为您的桌子看起来像这样:
和以下代码:
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
应该是一个表,其中包含溢出到最后一个可用日期之后的所有行(因此是“未分配的”)。如果没有这样的行(最后一个可用日期),则spilledOver
应该是一个空表。result
应该是一个表格,其中每个订单日期不得超过10个订单。 (您应该能够通过将result
与"orderDate"
分组,再与Table.RowCount
聚合,然后检查是否超过10个来确认这一点。)很显然,您需要为自己表的列名调整代码。