Фабрика может обрабатывать только 10 заказов в день. Как сделать sh даты вперед после 10 заказов? - PullRequest
1 голос
/ 14 марта 2020

Я работаю в файле Excel, который просто имеет два столбца: «Номер заказа» и «Дата».

Если в данный день более 10 заказов, заказы свыше 10 должны «разлит» на следующий рабочий день. Конечно, уже есть заказы на следующий рабочий день. Таким образом, перенос исходной даты на следующий рабочий день может сделать , что дневных заказов go свыше 10. Это своего рода рекурсивная проблема.

Я начал в Power Query и использовал столбец Index который начинается с 0 и сбрасывается в 0 для каждой группы из 10 номеров заказов. Затем добавлен пользовательский столбец с 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 Ответ

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

  • spilledOver должна быть таблицей, содержащей любые строки, которые вышли за пределы последней доступной даты (и, следовательно, являются "неназначенными"). Если таких строк не было (на последнюю доступную дату), spilledOver должна быть пустой таблицей.
  • result должна быть таблицей, в которой на каждую дату заказа должно быть не более 10 заказов. (Вы сможете подтвердить это, сгруппировав result по "orderDate" и агрегировав по Table.RowCount, а затем проверив, превышают ли они 10.)

Очевидно, вы необходимо настроить код для имен столбцов вашей таблицы.

...