私のファクト テーブル (PostgreSQL から) には、次のようなタイムスタンプがあります。
2016-07-01
このタイムスタンプを使用して、年/月/四半期/日のディメンションを表示するにはどうすればよいですか? Mondrian 4 スキーマの例が参考になります。
余分なタイムテーブルなどは使いたくありません。タイムスタンプだけ。
私のファクト テーブル (PostgreSQL から) には、次のようなタイムスタンプがあります。
2016-07-01
このタイムスタンプを使用して、年/月/四半期/日のディメンションを表示するにはどうすればよいですか? Mondrian 4 スキーマの例が参考になります。
余分なタイムテーブルなどは使いたくありません。タイムスタンプだけ。
この要件を解決する方法を見つけました。
問題は3つの異なる問題で構成されていました
以下で説明するように、3 つの問題をすべて解決しましたが、私の目には完璧な解決策はありません。改善の提案があれば、以下のコメントでお知らせください。以下で説明するものはすべて、メタモデル バージョン 4.0 および PostgreSQL データベース用です。
統合されたソリューションが見つからなかったため、独自のソリューションを作成しました。モンドリアン スキーマでは、テーブルの計算列を定義できます。
<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
同じ方法を使用して、タイムスタンプから必要なすべてのサブフィールドに年、月、... 列を追加できます。
四半期については、次のようになります。
<CalculatedColumnDef name='quarter'>
<ExpressionView>
<SQL dialect='generic'>
'Q' || EXTRACT(QUARTER FROM <Column name='date'/>)
</SQL>
</ExpressionView>
</CalculatedColumnDef>
これで、必要なサブフィールドごとにこれを行うだけで済みます。PostgreSQL からサポートされているすべてのサブフィールド: PostgreSQL - 日付/時刻関数 EXTRACT
mondrian スキーマでは、テーブルが定義されていないディメンションは使用できません。スキーマはファクト テーブルをデフォルト テーブルとして想定しているだけだと考える人もいますが、モンドリアン スキーマはそうではありません。
これを解決する方法は、モンドリアンのドキュメントには記載されていません。しかし、それはDimensionLinks
.
このリンクを使用します (ここでxy
ディメンション名を指定する必要があります):
<FactLink dimension="xy"/>
この時点で、モンドリアンが何をしているのかは本当に混乱しています。1.、2.、および階層次元のみで、Mondrian はクラッシュし、次のように言います。
次元「xy」; 定義されたキーを省略します。これは、単一の属性を持つ縮退ディメンションに対してのみ有効です。
それは私には意味がありませんし、解決策もまったく意味がありません。
key
ディメンションと対応するキー属性にa を追加するだけで機能します。理由がわからない!
モンドリアンのドキュメントでは、ディメンション タイプ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>
これが他の誰かに役立つことを願っています。