- Я не уверен, насколько хорошо будет масштабироваться приведенный ниже код (скажем, если у вас миллионы строк), но вы можете попробовать код и посмотреть, даст ли он ожидаемый результат. (Думаю, так и должно быть, но вы не привели пример своей таблицы и того, как она должна выглядеть, поэтому я не уверен.)
- Вы не определили «рабочий день». Можем ли мы безоговорочно предположить, что понедельник-пятница или есть праздничные c (которые могут приходиться на период с понедельника по пятницу), которые должны быть исключены?
- В приведенном ниже коде предполагается, что определение следующего рабочего дня является любым следующая доступная дата заказа (в самой таблице). Однако при использовании этого определения возникают следующие проблемы:
- Возможно ли, что на дату последнего заказа (представленную в таблице) будет более 10 заказов?
- Если это так, что следует сделать с заказами, которые выходят за пределы даты последнего заказа?
- Даты вашего заказа должны быть отсортированы в порядке возрастания (до того, как вы начнете их циклически выполнять).
- На данный момент Код возвращает как преобразованную таблицу, так и любые неиспользуемые строки, которые вышли за пределы последнего доступного рабочего дня. (Затем вы можете делать с ними все, что захотите.)
Полагаю, ваш стол выглядит примерно так:
и код ниже:
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.)
Очевидно, вы необходимо настроить код для имен столбцов вашей таблицы.