Вы можете попробовать что-то похожее на приведенное ниже (мои первые два шага someTable
и changedTypes
просто для воссоздания образца данных на моем конце):
let
someTable = Table.FromColumns({{"09:01:10", "09:02:30", "09:10:01"}, {"09:01:40", "09:04:50", "09:11:50"}, {"active", "active", "active"}}, {"start","stop","status"}),
changedTypes = Table.TransformColumnTypes(someTable, {{"start", type duration}, {"stop", type duration}, {"status", type text}}),
listOfRecords = Table.ToRecords(changedTypes),
transformList = List.Accumulate(List.Skip(List.Positions(listOfRecords)), {listOfRecords{0}}, (listState, currentIndex) =>
let
previousRecord = listOfRecords{currentIndex-1},
currentRecord = listOfRecords{currentIndex},
thereIsAGap = currentRecord[start] <> previousRecord[stop],
recordsToAdd = if thereIsAGap then {[start=previousRecord[stop], stop=currentRecord[start], status="passive"], currentRecord} else {currentRecord},
append = listState & recordsToAdd
in
append
),
backToTable = Table.FromRecords(transformList, type table [start=duration, stop=duration, status=text])
in
backToTable
Это то, с чего я начинаю (на шаге changedTypes
):
Вот что я получаю в итоге:
Для интеграции с существующим кодом M
вам, вероятно, потребуется:
- удалить
someTable
и changedTypes
из моего кода (и заменить существующим запросом)
- замените
changedTypes
в шаге listOfRecords
на то, что называется вашим последним шагом (в противном случае вы получите ошибку, если в вашем коде нет выражения changedTypes
).
Edit:
В дополнение к моему ответу я хотел бы предложить следующее:
Попробуйте изменить эту строку в коде выше:
listOfRecords = Table.ToRecords(changedTypes),
до
listOfRecords = List.Buffer(Table.ToRecords(changedTypes)),
Я обнаружил, что хранение списка в памяти значительно сократило время обновления (возможно, ~ 90%, если определить его количественно). Я предполагаю, что есть ограничения и недостатки (например, если список не может соответствовать), но может быть хорошо для вашего варианта использования.
Вы испытываете подобное поведение? Кроме того, мой базовый график, к сожалению, показывает нелинейную сложность кода.
Последнее замечание: я обнаружил, что генерация и обработка строк по 100 КБ приводили к переполнению стека при обновлении запроса (это могло произойти из-за генерации входных строк и может не включать вставку новых строк, не знаю). Ясно, что у этого подхода есть пределы.