如何在 Mondrian 4 Schema 中使用来自 PostgreSQL 的时间戳?

How to use Timestamp from PostgreSQL in Mondrian 4 Schema?

实际上 table(来自 PostgreSQL)我有一个时间戳,如下所示:

2016-07-01

如何使用此时间戳显示 Year/Month/Quarter/Day 维度? Mondrian 4 Schema 示例会很有帮助。

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

我找到了解决这个需求的方法。

这个问题由三个不同的问题组成

  1. 从时间戳获取子字段作为年、月或...
  2. 使用事实 table 列作为维度
  3. 在基于事实 table 的维度中使用 hierarchy/multiple 属性

我解决了所有的三个问题,如下所述,但是none的解决方案在我看来是完美的,所以如果您有任何改进建议,请在在下面评论。下面描述的所有内容都是针对元模型 4.0 版和 PostgreSQL 数据库的。


1。从时间戳

获取子字段作为年、月或...

我找不到集成的解决方案,因此我自己做了一个。 在 Mondrian Schema 中,您可以为 table 定义计算列。

<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'/>,您可以使用相同的 table 的列值。在上面的示例中,它是 sales table 的 store 列。

我们可以使用相同的方法为我们想要的时间戳之外的每个子字段添加年、月、...列。

季度看起来像这样:

<CalculatedColumnDef name='quarter'>
    <ExpressionView>
        <SQL dialect='generic'>
            'Q' || EXTRACT(QUARTER FROM <Column name='date'/>)
        </SQL>
    </ExpressionView>
</CalculatedColumnDef>

现在您只需为您需要的每个子字段执行此操作。 PostgreSQL 所有支持的子字段:PostgreSQL - Date/Time Function EXTRACT


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

没有定义 table 的维度在蒙德里安架构中是不可能的。有些人会认为模式只会假设事实 table 作为默认值 table 但蒙德里安模式不会。

mondrian文档中没有说明如何解决这个问题。但这就像为 DimensionLinks.

使用不同的 link 一样简单

使用这个 link(其中 xy 应该是维度名称):

<FactLink dimension="xy"/>

3。在基于事实 table 的维度

中使用 hierarchy/multiple 属性

在这一点上,蒙德里安的所作所为真的令人困惑。只有 1.、2. 和层次维度,蒙德里安崩溃并说:

Dimension 'xy'; omits a defined key, which is only valid for degenerate dimensions with a single attribute.

这对我来说没有任何意义,解决方案也没有任何意义。

只需将 key 添加到维度和相应的键属性即可。不知道为什么!


使用维度中的所有子字段

Mondrian 文档确实建议使用维度类型 TIME 和相应的属性 levelType

文档外:

Time dimensions based on year/month/week/day are coded differently in the Mondrian schema due to the MDX time related functions

对我来说,这没有任何区别,但我仍然将它包含在我的维度中:

<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. 中描述,link:

<Dimensions>
    <Dimension source="Time"/>
</Dimensions>

我希望这对其他人有帮助。