を含むデータウェアハウスのデータを照会Iは、時間ディメンションのための2つのテーブル時間ディメンション
日(日ごとに一意の行)
日の 時間(日中の毎分のためのユニークな行)
を有しますこのスキーマを考えると、最後のX時間(Xは0より大きい任意の数である可能性がある)のファクトを検索したい場合、クエリはどのように見えますか?
開始時間と終了時間が偶然になると、今年の2つの異なる日。
EDIT:私のファクトテーブルは
を含むデータウェアハウスのデータを照会Iは、時間ディメンションのための2つのテーブル時間ディメンション
日(日ごとに一意の行)
日の 時間(日中の毎分のためのユニークな行)
を有しますこのスキーマを考えると、最後のX時間(Xは0より大きい任意の数である可能性がある)のファクトを検索したい場合、クエリはどのように見えますか?
開始時間と終了時間が偶然になると、今年の2つの異なる日。
EDIT:私のファクトテーブルは
ファクトテーブルは当日の境界上で起こる奇妙なことで、時間のクエリを避けるために持っていない(とが必要です)元のタイムスタンプタイム・スタンプ列を持っていません。奇妙なことは、WHERE句に複雑な日時関数があることを意味します。
ほとんどのDWでは、これらのタイプのクエリは非常にまれですが、DWにデータをストリーミングして同時にレポートに使用しているようです。
だから私はお勧めします:
は、ファクトテーブルのフルタイムスタンプを紹介します。
古いレコードについては、日付と時刻キーからタイムスタンプを再作成してください。
DWクエリはすべてに約は、WHERE句で任意の機能を有する、または関数を使用する必要がある場合、それはSARGABLEであることを確認していません。
Start Date
とEnd Date
の列をTIMESTAMP
に変換して入力する方がよいでしょう。
テーブルをスライスするには、適切なinterval BETWEEN Start Date AND End Date
が必要です。あなたが取得する必要がありますことを、あなたが持っている現在のスキーマを与えられたように私には思える
Start Date <= (SYSDATE - (4/24)) AND End Date >= (SYSDATE - (4/24))
:Oracleではinterval
は、これも書き換えることができSYSDATE - (4/24)
またはSYSDATE - NUMTODSINTERVAL(4, 'HOUR')
の線に沿って何かだろう時間ディメンション表から適切な時間IDを検索条件に一致させてから、ファクト表の一致する行を検索します。あなたの時間ディメンションの粒度に応じて、あなたはどちらか(SQL Serverの例を)やってのパフォーマンスをチェックすることをお勧めします:
副選択:TIMEID INは(SELECT FOO FROM
SELECT X
:HOUR> = DATEPART(HOUR、CURRENT_TIMESTAMP())DIMTIME AND DATEID INからのIDはインナーに参加(DATE = GETDATE()DIMDATEからIDを選択します)
SELECT FOO INNER FROM XがDIMTIME ON TIMEID = DIMTIME.ID WHERE HOUR> = DATEPART(HOUR、CURRENT_TIMESTAMP())を内部結合がDATE = GETDATE()DIMDATE ON DATEID = DIMDATE.IDをJOIN
どちらでもありませんこれらは本当に魅力的な選択肢です。
「最後のX」分析ではなく、ロールアップ分析を目的としたキューブに対してクエリを実行している可能性がありますか?
「ロールアップ」キューブではない場合は、ファクトテーブルをより良いキーで再スタンプする必要があるという点で他のポスターに同意します。実際に頻繁に時間を検索するつもりならおそらくファクトテーブルにもその値を含めるべきです。他の試みはおそらくクエリを非サガブルにします(What makes a SQL statement sargable?参照)。 「スマート」
である必要があり、他のディメンション表、日付と時刻のディメンション・キーで使用される代理キーとは対照的に:
マイクロソフトは、http://msdn.microsoft.com/en-us/library/aa902672%28v=sql.80%29.aspxことをお勧めします日付ディメンションに推奨されるキーは、 "yyyymmdd"の形式です。この形式は、ユーザーが覚えてクエリに組み込むのが簡単です。また、日付別に複数の表にパーティション化されたファクト表の推奨サロゲート・キー形式です。
最高の運を!
どのようなrdbmsを使用していますか? –
おそらく時間の列を作成する(ビュー、または "with"、またはサブクエリとの結合だけを使用して)、それを使用します。時間のコマンドは、あなたが使用しているデータベースが何であるかを知ることが重要です。 –
現時点ではmysqlを使用していますが、近い将来にsqlserver、oracle、およびsqlliteで動作させる必要があります – WPFAbsoluteNewBie