Функция выполняет три операции сортировки и суммирует результат для каждой строки исходной таблицы (Movements).
Несмотря на то, что строки сгруппированы и агрегированы в таблице перемещений, это приводит к множеству этапов фильтрации и требует больших затрат.
Есть ли способ лучше?
SelectBalanceFromMovements (,,):
(TrYrPr as number,
ProdNo as number,
StorageNo as number) =>
let
Source = Table.SelectRows(Movements, each [TransYearPeriod] < TrYrPr),
Step1 = Table.SelectRows(Source, each [ProdNo] = ProdNo),
Step2 = Table.SelectRows(Step1, each [StorageNumber] = StorageNo),
Step3 = Table.Group(Step2, {"ProdNo", "StorageNumber"}, {{"Balance", each List.Sum([Movement]), type number}}),
Step4 = Table.AddColumn(Step3, "TransYearPeriod", each TrYrPr)
in
Step4
Изменения:
Изменено предложением greggyb объединить шаги фильтра, и мне не нужен столбец периода:
(TrYrPr as number,
ProdNo as number,
StorageNo as number) =>
let
Step1 = Table.SelectRows(Movements, each [StorageNumber] = StorageNo and [ProdNo] = ProdNo and [TransYearPeriod] < TrYrPr),
Step2 = Table.Group(Step1, {"ProdNo", "StorageNumber"}, {{"Balance", each List.Sum([Movement]), type number}})
in
Step2
Эти изменения не повлияли заметно на производительность.
Вывод правильный и эффективный, но не очень эффективный.
Я считаю, что медленная обработка происходит не из-за агрегации, а из-за создания нескольких копий данных в памяти во время фильтрации.
Эта функция запускается 1 раз для каждой строки в ссылке на мою исходную таблицу Movements, а там 380 строк.
Есть ли способ ускориться? Можно ли вместо этого использовать DAX?
Изменить: Вызов функции:
#"Invoked Custom Function" = Table.AddColumn(#"Removed Columns", "SelectBalanceFromMovements", each SelectBalanceFromMovements([TransYearPeriod], [ProdNo], [StorageNumber])),
#"Expanded SelectBalanceFromMovements" = Table.ExpandTableColumn(#"Invoked Custom Function", "SelectBalanceFromMovements", {"Balance"}, {"SelectBalanceFromMovements.Balance"}),
Table.SelectRows
вместо трех последовательных. Вы можете выполнить логическое И сand
на одном шаге фильтрации, относящемся ко всем 3 столбцам. Вы также можете объединить своиStep3
иStep4
, определив второй столбец в вашемTable.Group
, логика которого равна{"TransYearPeriod", each TrYrPr}
. - person greggyb   schedule 18.09.2019Table.Buffer
, а списки - вList.Buffer
. Buffer помещает ваши данные в память. Также отключите фоновое обновление, если оно в данный момент включено. Это хорошие посты с множеством способов улучшить производительность. thebiccountant.com/speedperformance-aspects adatis.co.uk/buffer-m-function-in-query-editor-power-bi а> - person Jenn   schedule 27.09.2019