Очень сложно дать совет по оптимизации, не видя данных и модели данных (было бы здорово, если бы они были включены в вопрос).
Ключевой вопрос здесь заключается в том, что наличие дубликатов делает факт «единицы» неаддитивным, а это означает, что вы не можете просто свернуть его в иерархии.В результате вы вынуждены делать очень дорогой тройной цикл.
Очевидное решение - сделать «единицы» полностью аддитивными.Вы можете вычислить дедуплицированные (с поправкой на дубликаты) единицы и сохранить их фактически в виде вычисляемого столбца:
Adjusted Units =
DIVIDE (
'FACT Opportunity'[Units],
CALCULATE ( COUNT ( 'FACT Opportunity'[DetailId] ) )
)
Здесь вы делите единицы на количество уникальных DetailIDs (обычно это будет1, но в случае дубликатов DetailID будет 2 и т. Д.).
Этот вычисленный столбец немного увеличит время загрузки ваших данных, но сэкономит много времени на запрос.Для дальнейшей оптимизации рассмотрите возможность предварительного расчета в хранилище данных.
Скорректированные Единицы являются полностью аддитивными, поэтому вы теперь просто: 1011 *
Total Units = SUM('FACT Opportunity'[Adjusted Units])
Он должен корректно работать на любом уровне иерархии Order> Line> Detail (если нет дополнительных проблем)не описано в вопросе), и это должно быть быстро.