在我的事实表(来自PostgreSQL)中,我有一个如下所示的时间戳: 2016年7月1日如何使用此时间戳显示年/月/季/日维度?蒙德里安4架构的例子是……
我找到了解决这个要求的方法。
问题包括三个不同的问题
我解决了所有这三个问题,如下所述,但没有一个解决方案在我看来是完美的,所以如果你有任何改进建议,请在下面的评论中告诉我。下面描述的所有内容都适用于元模型4.0和PostgreSQL数据库。
我找不到一个集成的解决方案,因此我自己做了。 在Mondrian Schema中,您可以为表定义计算列。
<Table name="sales" schema="reporting"> <ColumnDefs> <CalculatedColumnDef name='store2'> <ExpressionView> <SQL dialect='generic'> <Column name='store'/> </SQL> </ExpressionView> </CalculatedColumnDef> </ColumnDefs> </Table>
不知怎的,蒙德里安总是使用 generic 作为方言和其他 postgres 因为方言不起作用。同 <Column name='column'/> 您可以使用同一个表的列值。在上面的例子中,它是 store 的列 sales 表。
generic
postgres
<Column name='column'/>
store
sales
我们可以使用相同的方法为时间戳之外的每个子字段添加年,月,...列。
对于季度,它看起来像这样:
<CalculatedColumnDef name='quarter'> <ExpressionView> <SQL dialect='generic'> 'Q' || EXTRACT(QUARTER FROM <Column name='date'/>) </SQL> </ExpressionView> </CalculatedColumnDef>
现在,您只需为您需要的每个子字段执行此操作。 来自PostgreSQL的所有受支持的子字段: PostgreSQL - 日期/时间功能提取
mondrian模式中不可能没有定义表的维度。有些人会认为模式只是将事实表假设为默认表,但mondrian模式不会。
如何解决这个问题在mondrian文件中没有说明。但它就像使用不同的链接一样简单 DimensionLinks 。
DimensionLinks
使用此链接(在哪里 xy schould是尺寸名称):
xy
<FactLink dimension="xy"/>
在这一点上,蒙德里安的确令人困惑。只有1.,2和层级维度蒙德里安崩溃并说:
尺寸'xy';省略定义的键,该键仅对具有单个属性的退化维度有效。
这对我没有任何意义,解决方案根本没有任何意义。
只需添加一个 key 维度和相应的键属性,它的工作原理。不明白为什么!
key
Mondrian文档确实建议使用维度类型 TIME 和相应的属性 levelType 的。
TIME
levelType
在文档中:
由于MDX时间相关功能,基于年/月/周/日的时间维度在蒙德里亚模式中的编码方式不同
对我来说,这根本没有任何区别,但我仍然把它包含在我的维度中:
<Dimension name='Time' key="Timestamp" type="TIME"> <Attributes> <Attribute name='Timestamp' table='sales' keyColumn='slice_date' hasHierarchy="false"/> <Attribute name='Year' table='sales' keyColumn='year' levelType="TimeYears" hasHierarchy='false'/> <Attribute name='Quarter' table='sales' keyColumn='quarter' levelType="TimeQuarters" hasHierarchy='false'/> <Attribute name='Month' table='sales' keyColumn='month' levelType="TimeMonths" hasHierarchy='false'/> <Attribute name='Day' table='sales' keyColumn='day' levelType="TimeWeeks" hasHierarchy='false'/> <Attribute name='Week' table='sales' keyColumn='week' levelType="TimeDays" hasHierarchy='false'/> <Attribute name='Day of Week' table='sales' keyColumn='dayOfWeek' levelType="TimeWeeks" hasHierarchy='false'/> </Attributes> <Hierarchies> <Hierarchy name='Monthly'> <Level attribute='Year'/> <Level attribute='Quarter'/> <Level attribute='Month'/> </Hierarchy> <Hierarchy name='Weekly'> <Level attribute='Year'/> <Level attribute='Week'/> <Level attribute='Day of Week'/> </Hierarchy> </Hierarchies> </Dimension>
现在,您只需要在一个多维数据集中使用此维度,其中包含:2.decribed,链接:
<Dimensions> <Dimension source="Time"/> </Dimensions>
我希望这确实有助于其他人。