Я использовал следующую таблицу для создания прототипа решения:
Имя таблицы: «Данные»
(имена столбцовнемного отличается, чтобы сделать наименование меры проще; измените их по своему усмотрению).
Создайте первую меру:
Total Amount = SUM(Data[Amount])
Создайте вторую меру:
Accumulated Difference =
VAR Current_Index = MAX ( Data[Index] )
VAR Initial_Amount =
CALCULATE (
MAX ( Data[Amount] ),
FILTER ( ALL ( Data ), Data[Index] = 1 ) )
VAR Accumulated_Reductions =
CALCULATE (
[Total Amount],
FILTER ( ALL ( Data ), Data[Index] > 1 && Data[Index] <= Current_Index ) )
RETURN
Initial_Amount - Accumulated_Reductions
Создайте третьюмера:
% Previous =
VAR Current_Index = MAX ( Data[Index] )
VAR Current_Difference =
CALCULATE (
[Accumulated Difference],
FILTER ( ALL ( Data ), Data[Index] = Current_Index ) )
VAR Previous_Difference =
IF (Current_Index > 1,
CALCULATE (
[Accumulated Difference],
FILTER ( ALL ( Data ), Data[Index] = Current_Index - 1 ) ) )
RETURN
DIVIDE ( Current_Difference, Previous_Difference )
Результат:
Объяснение:
Первая мера просто для удобства, чтобыИзбегайте записи одного и того же суммирования несколько раз.
Вторая мера: Сначала мы находим индекс видимым в текущей строке и сохраняем его в переменной.Затем мы находим начальную сумму (сумма, где индекс = 1), потому что она нам нужна в качестве отправной точки.ВСЕ необходимо, чтобы игнорировать фильтры, примененные к строке.Затем, используя аналогичную схему, мы вычисляем накопленные сокращения между текущей и исходной строками (например, для шага D нам нужно суммировать суммы для индексов (4, 3, 2)). Наконец, желаемый результат - это просто начальная сумма -накопленные сокращения.
Третья мера: Используя очень похожую технику, мы сначала находим накопленную разницу для текущей строки, затем для предыдущей строки.Единственным нюансом здесь является проверка предыдущей строки на предмет начальных условий (если это начальная строка с индексом 1, не рассчитывайте предыдущие значения).Как только текущие и предыдущие различия известны, мы просто делим их.