web-dev-qa-db-ja.com

事実、2つの条件に基づく時間階層をモデル化するためのアドバイス

私の質問がそのSEに属していない場合は申し訳ありませんが、最適な場所を見つけようとしましたが、ここで終わりました。

私の問題はこれです:

データウェアハウス環境にこのようにモデル化されたテーブルがあります。 :

MYTABLE (service_id, date_input, date_when_active, date_when_inactive, bunch_of_values...)

このテーブルは毎晩、prodenvからの新しいレコードで更新されます。レコードがprodで変更され、すでにdwに存在する場合、同じserviceidでdwに新しいレコードが作成され、when_inactiveフィールドのsysdateで古いレコードが更新されます。新しく作成されたレコードには、when_inactiveフィールドからnullがあります。

クエリを使用して、いくつかの条件を使用してこのテーブルからデータを抽出し、正確な期間のすべてのサービスの値を正確に取得します。クエリは次のようになります:

select *
from mytable
where service_date_input between :p_date_start and :p_date_end
and :p_date_end between date_when_active and nvl(date_when_inactive,:p_date_end)

私がやりたいのは、Cognos Framework Managerで時間階層をモデル化して、会計年度、期間、週、月などをドリルダウンできるようにすることです。

私が理解できないのは、計算されたfiscal_year_idperiod_idweek_idmonth_idなどをDBに直接含めるようにテーブルを改造する必要があるかどうかです。 Cognos FWMで直接行うことは可能ですか?

要件の1つは、ユーザーに2つの日付セットの使用を強制しないことです(入力日と会計年度でフィルター処理します)。入力日は透過的にフィルタリングする必要があります。会計年度パラメータを使用してデータをフィルタリングまたは表示する場合、入力日ルールがそれに応じて適用される必要があります。

2
Philippe

日付ディメンション テーブルが必要で、次のようになります。

create table calendar (
  date_id int primary key,
  name text not null unique,
  date_iso date unique,
  year smallint,
  quarter_of_year smallint,
  month_of_year smallint,
  day_of_year smallint,
  day_of_month smallint,
  fiscal_year smallint,
  quarter_of_fiscal_year smallint,
  month_of_fiscal_year smallint,
  ...

);

次のようなデータを挿入します。

insert into calendar values 
(0, 'N/A', null, ...),
(20130703, '2013-07-03', '2013-07-03', 2013, 3, 7, 184, 3, ...),
(20130704, '2013-07-04', '2013-07-04', 2013, 3, 7, 185, 4, ...);

ノート:

  • ファクトテーブルのパーティション分割を容易にするために、日付ディメンションの主キーとしてスマートキー(20130703のように日付をキーとして)を使用します。ウェアハウスでスマートキーを使用する必要があるのはこれだけです。それ以外の場合は、意味のない代理を使用してください。

  • テキストの「名前」フィールドを使用して、「N/A」の日付を許可します

  • 1つの日付ディメンションテーブルが必要であり、ファクトテーブルの日付キーはすべてそれを指している必要があります

  • 日付ディメンションテーブルに時間を含めないでください。時間を追跡する必要がある場合は、時間ディメンションテーブルを検討してください。

2
Neil McGuigan