如何在Mondrian 4 Schema中使用PostgreSQL的Timestamp?

时间:2016-07-18 16:08:06

标签: timestamp schema olap mondrian degenerate-dimension

在我的事实表(来自PostgreSQL)中,我有一个如下所示的时间戳:

  

2016年7月1日

如何使用此时间戳显示年/月/季/日维度? 蒙德里安4架构的例子会有所帮助。

我不想使用额外的时间表或类似的东西。只是时间戳。

1 个答案:

答案 0 :(得分:0)

我找到了解决此要求的方法。

问题包括三个不同的问题

  1. 从时间戳
  2. 获取年,月或...的子字段
  3. 使用事实表列作为维度
  4. 在基于事实表的维度
  5. 中使用层次结构/多个属性

    我解决了所有三个问题,如下所述,但在我看来,没有一个解决方案是完美的,所以如果你有任何改进建议,请在下面的评论中告诉我。下面描述的所有内容都适用于元模型版本4.0和PostgreSQL数据库。

    1。从时间戳

    获取年,月或...的子字段

    我无法找到一个集成的解决方案,因此我自己做了。 在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

    2。使用事实表列作为维度

    mondrian模式中无法使用没有定义表的维度。有些人会认为模式只是将事实表假设为默认表,但mondrian模式不会。

    mondrian文档中没有说明如何解决这个问题。但它就像为DimensionLinks使用不同的链接一样简单。

    使用此链接(其中xy schould为维度名称):

    <FactLink dimension="xy"/>
    

    3。在基于事实表的维度

    中使用层次结构/多个属性

    在这一点上,蒙德里安所做的事情让人感到困惑。只有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>
    

    我希望这确实有助于其他人。