Невременной уровень внутри временного измерения

У меня есть измерение времени, определенное примерно так:

<Dimension name="optin" type="TimeDimension">
  <Hierarchy name="optin" hasAll="true" allMemberName="all optin" primaryKey="profile_id">
    <Table schema="schema1" name="profiles"/>
    <Level name="optin_year" column="optin_year" uniqueMembers="false" type="Numeric" levelType="TimeYears"/>
    <Level name="optin_quarter" column="optin_quarter" uniqueMembers="false" type="Numeric" levelType="TimeQuarters"/>
    <Level name="optin_month" column="optin_month" uniqueMembers="false" type="Numeric" levelType="TimeMonths"/>
    <Level name="optin_day_in_month" column="optin_day_in_month" uniqueMembers="false" type="Numeric" levelType="TimeDays"/>
  </Hierarchy>
</Dimension>

Это хорошо работает для сегментации по разным частям даты (год, квартал, месяц, день). Однако я также хочу иметь возможность сообщать о количестве профилей, в которых заполнено поле optin (не NULL). Для невременных измерений добавление этой иерархии к вышеуказанному измерению работает:

<Hierarchy name="defined" hasAll="true" allMemberName="all optin" primaryKey="profile_id">
  <Table schema="schema1" name="profiles"/>
  <Level name="defined" uniqueMembers="true" type="Boolean">
    <KeyExpression>
      <SQL>optin_day_in_month IS NOT NULL</SQL>
    </KeyExpression>
  </Level>
</Hierarchy>

Однако, когда я добавляю это к измерению времени, я получаю следующее исключение от Мондриана:

Level '[optin.defined].[defined]' belongs to a time hierarchy, so
its level-type must be 'Years', 'Quarters', 'Months', 'Weeks' or
'Days'.

Я могу поместить иерархию defined в отдельное измерение, но тогда я получу два неортогональных измерения, которые не имеют смысла сегментировать одновременно. На самом деле это являются двумя иерархиями в одном измерении. Я также могу превратить измерение optin в измерение, не связанное со временем, но тогда я потеряю возможность использовать функции временных рядов (PARALLELPERIOD, YTD и т. д.).

Каков наилучший способ добиться того, чего я хочу - иметь возможность сегментировать части поля даты и определить, пусто оно или нет?


person user3113189    schedule 17.12.2013    source источник


Ответы (1)


Уровень '[optin.defined].[defined]' принадлежит временной иерархии, поэтому его тип уровня должен быть "Годы", "Кварталы", "Месяцы", "Недели" или "Дни".

Ошибка сообщает вам, что невозможно иметь «независимые от времени» (Regular) уровни в измерении времени (TimeDimension):

<Dimension name="optin" type="TimeDimension">
   ...
   <Level name="defined" uniqueMembers="true" type="Boolean">

Уровень типа Regular можно использовать только с StandardDimension.

Каков наилучший способ добиться того, чего я хочу - иметь возможность сегментировать части поля даты и определить, пусто оно или нет?

Я думаю, что вы неправильно используете измерение времени. Стандартным способом является измерение времени следующим образом:

  • DWH: предварительно загруженные данные о времени в хранилище данных (записи за каждый день, скажем, с 01.01.1900 по 31.12.2099) — таблица dim_time с date_key (например, 20150123)
  • Схема OLAP: правильное измерение времени <Dimension name="Time" type="TimeDimension">, которое содержит levels для "годов/кварталов/месяцев/недель/дней". Подобно тому, что у вас есть, но таким образом, он содержит все дни. С атрибутом primary_key, указывающим на date_key.

Следующим шагом является настройка optin (профиля):

  • DWH: optin данных строки + ключ optin_date_key (который может быть нулевым или иметь значение)
  • Схема OLAP: создайте куб для profile с использованием измерения времени, созданного ранее, с foreign_key, указывающим на optin_date_key. И мера, которая суммирует все профили с ненулевыми значениями optin_date_key.

Пример кода OLAP для куба профиля:

<DimensionUsage source="Time" name="Time" caption="Profile Date" visible="true" foreignKey="optin_date_key" highCardinality="false">
</DimensionUsage>
<Measure name="#Profiles" aggregator="sum" visible="true">
  <MeasureExpression>
    <SQL dialect="generic">
        <![CDATA[optin_date_key]]>
    </SQL>
  </MeasureExpression>
</Measure>

Таким образом, вы сможете сообщить количество профилей, в которых поле optin заполнено (не NULL).

Что еще вы можете сделать, так это использовать этот куб в виртуальном кубе для объединения других мер.

person mzy    schedule 23.01.2015