Выровняйте временные ряды, установив дату начала каждого ряда по дате привязки (icCube).

(надеюсь мой заголовок понятен)

У меня есть оператор MDX, который приводит к:

  • время (месяцы) в строках
  • несколько проектов в рубриках

Отображаемые данные представляют собой сумму (например, затраты).

Теперь я хотел бы сравнить проектные расходы для каждого проекта и посмотреть, есть ли временные различия. Таким образом, я хочу получить фиктивную временную ось (начальный месяц, месяц + 1, месяц + 2, .... месяц + 60) и для каждого относительного месяца расходы на каждый проект.

Я приведу пример данных для иллюстрации (прикрепленное изображение). (рассмотрите зеленую часть как время жизни проекта — вы можете предположить 0 затрат в течение срока службы и нулевые затраты вне срока действия): введите здесь описание изображения

Я думаю, что могу написать для этого довольно сложный MDX (например, использовать текущий период в качестве начального месяца и добавить к нему 12 месяцев), затем для каждого проекта искать сумму в «текущем прогнозируемом периоде» - «дате начала проекта». ". Хотя это будет немного грязно.

Есть ли более простой способ сделать это. Например, используя одну или несколько пользовательских функций матрицы/вектора icCube? Я хотел бы использовать конечный результат в виджете для графического отображения данных.


person Arthur    schedule 29.03.2017    source источник
comment
короткий ответ да, длинный ответ завтра :-)   -  person ic3    schedule 29.03.2017


Ответы (1)


Мы ищем такую ​​таблицу:

+----------+-----------------+----------------+
|          |   Proj1         | Proj2          |
+----------+-----------------+----------------+
| Month 1  | (Month1,Proj1)  | (Month1,Proj2) |
| Month 2  | (Month2,Proj1)  | (Month2,Proj2) |
| Month 3  | (Month2,Proj1)  | (Month3,Proj2) |
+----------+-----------------+----------------+

Где

 MonthN is the Nth month from the start of the project

Этот MonthN динамически изменяется в каждой ячейке и будет зависеть от даты начала проекта. В MDX это вычисляемый элемент, который должен выглядеть так:

MyCalcM AS IIF( [Project].current.isAll, null, ProjectStartDate([Project].current).lag(n) )

где ProjectStartDate — функция, возвращающая дату начала проекта. Мы не будем вдаваться в суть этой функции, но мы можем создать уровень кэшированной схемы объявленная функция со статическим контекстом, поэтому она будет вычислена только один раз.

Теперь нам нужно связать эту вычисляемую меру с параметром [дата проекта]. В многомерных выражениях это можно сделать с помощью так называемого измерения полезности ( link< /а> ). Вспомогательные измерения — это измерения, которые определяют преобразование, также известное как вычисление. член, для каждого из его членов вместо классического поведения slice&dice.

Существуют разные решения для построения этого измерения.

Один делает что-то похожее на гистограмму, определенную здесь, это может быть немного громоздким, так как вам нужно вручную создавать каждого члена.

Другой создает непосредственно из таблицы фактов новое измерение [Время проекта], которое не связано в схеме с какими-либо фактами, подобными этому:

 Name ,  addMonths
 First Month, 0
 Month 2, 1
 Month 3, 2
 ..
 Month N, n-1

Мы должны создать вычисляемый элемент, который связывает это измерение с вычислением. участники, использующие ключ участника для вычисления задержки ( lag(n) -> lag( [Project Time].current.key ) ). Недостаток этого решения в том, что нам нужно активировать эту вычисляемую меру.

Надеюсь, поможет

person ic3    schedule 30.03.2017
comment
Да, конечно помогает. Когда я связался с вами по этому поводу, вы также дали возможность создать новое измерение под названием [Время проекта] и связать его с данными во время загрузки данных. Я предполагаю, что это можно сделать с помощью базового преобразования с использованием функций ETL. Я думаю, что я склоняюсь к этому варианту. Я проверил ваше решение как хорошее решение - но - я буду следовать второму варианту, только что описанному выше. - person Arthur; 04.04.2017