2016-07-28 3 views
0

Я новичок в PowerPivot и DAX. Я следил за некоторыми онлайновыми учебниками. Теперь у меня есть небольшая проблема, которую я не могу решить. У меня есть следующие данные:Сравните значения предыдущей даты и второй предыдущей даты в PowerPivot

Date Instrument Value 2016-07-27 A 100 2016-07-27 B 98 2016-07-26 A 102 2016-07-25 B 99

Для каждой даты я хотел бы, чтобы вычислить разницу (Profit/Loss) в Value между самой последней датой и второй самый последний момент. Для данных над ним будет следующим:

Date Instrument Value Profit/Loss 2016-07-27 A 102 2 ([Val. inst. A 2016-07-27]-[Val. inst. A 2016-07-26]) 2016-07-27 B 98 -1 ([Val. inst. B 2016-07-27]-[Val. inst. B 2016-07-25]) 2016-07-26 A 100 2016-07-25 B 99

Я попытался с DAX найти второй по величине дату, используя =EARLIER([Date]), но не удалось заставить его работать. Со второй по величине дате я мог бы найти Value, соответствующий этой дате. Любые предложения о том, как это можно решить?

ответ

0

В конце концов я придумал решение в три этапа (шаги можно объединить в один шаг). Сначала я оцениваю все даты, причем последнее из них - 1, а второе последнее - 2. После этого я получаю Value для второго последнего дня для каждой строки. Наконец, я вычисляю разницу между текущей строкой Value и Value для второго последнего дня по сравнению с датой этой строки.

Для ранга даты, которые я использовал следующее:

=RANKX(FILTER(ALL(table);EARLIER([Instrument])=[Instrument]);[Date];;FALSE())

Пояснение к тому, что я думаю, что DAX формула делает. RANKX работает, беря таблицу, а затем оценивает значения в столбце в этой таблице. Выше я использовал отфильтрованную таблицу в качестве таблицы. Отфильтрованная таблица создает новую таблицу для каждой строки, содержащей только тот же инструмент, что и инструмент для этой конкретной строки. Для первой строки отфильтрованная таблица будет выглядеть ниже.

Date Instrument Value 2016-07-27 A 100 2016-07-26 A 102

Даты в этой отфильтрованной таблице затем ранжируются.

Date Instrument Value Rank 2016-07-27 A 100 1 2016-07-26 A 102 2

Используя ранг я тогда вытаскивать вторую самые последние даты Value для каждой строки на основе Rank-1 текущей строки.

Value second most recent date = CALCULATE(MAX([Value]);FILTER(table;EARLIER([Instrument])=[Instrument] && [Date Rank]= EARLIER([Date Rank]))

Наконец рассчитать разницу:

PnL = [Value] - [Value second most recent date]

я не уверен, что EARLIER делает, но я думаю, что это какое-то итерационный процесс.

Смежные вопросы