如何在 Mondrian 4 Schema 中使用来自 PostgreSQL 的时间戳?
Posted
技术标签:
【中文标题】如何在 Mondrian 4 Schema 中使用来自 PostgreSQL 的时间戳?【英文标题】:How to use Timestamp from PostgreSQL in Mondrian 4 Schema? 【发布时间】:2016-07-18 16:08:06 【问题描述】:在我的事实表(来自 PostgreSQL)中,我有一个如下所示的时间戳:
2016-07-01
如何使用此时间戳来显示年/月/季度/日维度? Mondrian 4 Schema 示例会很有帮助。
我不想使用额外的时间表或类似的东西。只是时间戳。
【问题讨论】:
【参考方案1】:我找到了解决这个要求的方法。
这个问题由三个不同的问题组成
-
从时间戳中获取年、月或...等子字段
使用事实表列作为维度
在基于事实表的维度中使用层次结构/多个属性
我解决了所有三个问题,如下所述,但没有一个解决方案在我看来是完美的,所以如果您有任何改进建议,请在下面的评论中告诉我。下面描述的所有内容都适用于元模型 4.0 版和 PostgreSQL 数据库。
1。从时间戳获取子字段为年、月或...
我找不到一个集成的解决方案,因此我自己做了一个。 在蒙德里安模式中,您可以为表定义计算列。
<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'/>
,您可以使用同一个表的列值。在上面的示例中,它是sales
表的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。使用事实表列作为维度
没有定义表的维度在 mondrian 模式中是不可能的。有些人会认为架构只会将事实表假定为默认表,但 mondrian 架构不会。
mondrian 文档中没有说明如何解决此问题。但这就像为DimensionLinks
使用不同的链接一样简单。
使用此链接(xy
应该是维度名称):
<FactLink dimension="xy"/>
3。在基于事实表的维度中使用层次结构/多个属性
在这一点上,蒙德里安的所作所为真的令人困惑。只有 1.、2. 和分层维度 Mondrian 崩溃并说:
维度'xy';省略定义的键,该键仅对具有单个属性的退化维度有效。
这对我来说没有任何意义,解决方案也完全没有意义。
只需将key
添加到维度和相应的键属性即可。不知道为什么!
使用维度中的所有子字段
Mondrian 文档确实建议使用维度类型 TIME
和相应的属性 levelType
's。
文档外:
由于 MDX 时间相关函数,基于年/月/周/日的时间维度在 Mondrian 模式中的编码方式不同
对我来说,这根本没有区别,但我仍然将它包含在我的维度中:
<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>
我希望这对其他人有帮助。
【讨论】:
以上是关于如何在 Mondrian 4 Schema 中使用来自 PostgreSQL 的时间戳?的主要内容,如果未能解决你的问题,请参考以下文章
Mondrian的schema中,如何做到同一纬度的不同level数据作为查询条件来用?
Saiku Mondrian Schema 错误 - 也许是括号?
Mondrian Schema Workbench 概念及常用参数