0

私のファクト テーブル (PostgreSQL から) には、次のようなタイムスタンプがあります。

2016-07-01

このタイムスタンプを使用して、年/月/四半期/日のディメンションを表示するにはどうすればよいですか? Mondrian 4 スキーマの例が参考になります。

余分なタイムテーブルなどは使いたくありません。タイムスタンプだけ。

4

1 に答える 1

0

この要件を解決する方法を見つけました。

問題は3つの異なる問題で構成されていました

  1. タイムスタンプから年、月、または ... としてサブフィールドを取得する
  2. ファクト テーブルの列をディメンションとして使用する
  3. ファクト テーブル ベースのディメンションで階層/複数の属性を使用する

以下で説明するように、3 つの問題をすべて解決しましたが、私の目には完璧な解決策はありません。改善の提案があれば、以下のコメントでお知らせください。以下で説明するものはすべて、メタモデル バージョン 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'/>使用すると、同じテーブルの列の値を使用できます。上記の例では、テーブルのstore列です。sales

同じ方法を使用して、タイムスタンプから必要なすべてのサブフィールドに年、月、... 列を追加できます。

四半期については、次のようになります。

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

これで、必要なサブフィールドごとにこれを行うだけで済みます。PostgreSQL からサポートされているすべてのサブフィールド: PostgreSQL - 日付/時刻関数 EXTRACT


2. ファクト テーブルの列をディメンションとして使用する

mondrian スキーマでは、テーブルが定義されていないディメンションは使用できません。スキーマはファクト テーブルをデフォルト テーブルとして想定しているだけだと考える人もいますが、モンドリアン スキーマはそうではありません。

これを解決する方法は、モンドリアンのドキュメントには記載されていません。しかし、それはDimensionLinks.

このリンクを使用します (ここでxyディメンション名を指定する必要があります):

<FactLink dimension="xy"/>

3. ファクト テーブル ベースのディメンションで階層/複数の属性を使用する

この時点で、モンドリアンが何をしているのかは本当に混乱しています。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>

これが他の誰かに役立つことを願っています。

于 2016-07-20T13:56:34.430 に答える