在我的事实表(来自PostgreSQL)中,我有一个如下所示的时间戳:
2016年7月1日
如何使用此时间戳显示年/月/季/日维度? 蒙德里安4架构的例子会有所帮助。
我不想使用额外的时间表或类似的东西。只是时间戳。
答案 0 :(得分:0)
我找到了解决此要求的方法。
问题包括三个不同的问题
我解决了所有三个问题,如下所述,但在我看来,没有一个解决方案是完美的,所以如果你有任何改进建议,请在下面的评论中告诉我。下面描述的所有内容都适用于元模型版本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>
不知何故,mondrian总是使用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 - Date/Time Function EXTRACT
mondrian模式中无法使用没有定义表的维度。有些人会认为模式只是将事实表假设为默认表,但mondrian模式不会。
mondrian文档中没有说明如何解决这个问题。但它就像为DimensionLinks
使用不同的链接一样简单。
使用此链接(其中xy
schould为维度名称):
<FactLink dimension="xy"/>
在这一点上,蒙德里安所做的事情让人感到困惑。只有1.,2和层级维度蒙德里安崩溃并说:
尺寸&#39; xy&#39 ;;省略定义的键,该键仅对具有单个属性的退化维度有效。
这对我没有任何意义,解决方案根本没有任何意义。
只需在维度和相应的键属性中添加key
即可。不知道为什么!
Mondrian文档确实建议使用维度类型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.所描述的链接:
<Dimensions>
<Dimension source="Time"/>
</Dimensions>
我希望这确实有助于其他人。