フロント「レポートの自動化:なしストレス次元モデリング」ファクト表とディメンション表次元モデリングについての簡単な例のスーパーマーケットの概念を注文するには、この特定のデータの内寸この1時間ディメンションに関する主な話コンテンツ。
なぜそれが特別な時間ディメンションのですか?例えば、商品の分類:野菜、果物、飲料、小型家電製品の様々な......分類が、このカテゴリーの限られた数ではなく、多くが、その後の時間のために、各時点での値です。
一部の人々は、ディメンション表の処理がリストにないとして時以来、それはそれほどではなかったと言いますか?しかし、私たちの様々な統計は、その日の売上高として、基礎と時間に応じて年間の成長に年を判断する傾向がある......だから、どのように我々はそれに対処するのですか?
シンプルな時間ディメンション
まず、我々は必要なものを決定する必要があり最小粒度的时间
、我々は第二に、正確な業務記録を見つけることを期待ところ、多くのミリ秒レベルの時間よりも、我々はそれが私たちの未来のレポートに基づいて処理する必要があるステップする必要があります。
例えば、我々は、我々は、最小サイズの値として日付に緯度を必要とする、ビジネス毎日の情報を分析する必要があります。最小の粒度としてディメンション表と我々日付、データのラインは毎日、1日保存された寸法タイプ。
私たちは訪問者の数や訪問者の午前午後の区別の数を比較する必要がある場合は、我々は午後に午前の正確な寸法に必要になることがあり、この時間は、おそらく夜が必要ですか?このような日が3種類に分割する必要がありますが、データの3行が毎日あります。
そして、私たちのディメンション表には、それを格納しますか?ディメンション表の最小の細かさのためのシンプルな日付で見てみましょう dim_date_time_utc8
UTC + 8日 | 開始時間 | 終了時刻 |
---|---|---|
2010年10月10日 | 2019年10月9日夜四時00分00秒 | 2019年10月10日夜四時00分00秒 |
2010年10月11日 | 2019年10月10日夜四時00分00秒 | 2019年10月11日夜四時00分00秒 |
2010年10月12日 | 2019年10月11日夜四時00分00秒 | 2019年10月12日夜四時00分00秒 |
2010年10月13日 | 2019年10月12日夜四時00分00秒 | 2019年10月13日夜四時00分00秒 |
上記のディメンション表を通じ、我々はすぐにデータベースができ UTC
、変換時間 UTC+8
、日付、時間帯、すぐに直接データを読み取るために、バックエンドのレポートを生成し、同じことが、我々は速い、タイムゾーンの複数のディメンションを作成することはできません。複数のタイムゾーンの日付を数えました。
そう、このディメンション表が作成の過程で保存することができますが、我々は、必要に応じて千年後、データは、最後の2年間を示すために必要な症例報告として、生成されることができるの寸法に初めから宇宙の創造を生成しないことに注意我々は、データの処理と分析の間、データベースがこの時間ディメンションテーブルによって時間範囲外でフィルタリングするデータの量を減らすことができるようにするとき、最後の2年緯度生成する必要があります。
断片化された時間の値をタップします
私たちはそれを行う方法の、このような粒度の高度、午前午後夕方の時間ディメンションを見てみましょうか?私たちは時間が最小の粒度であることを時間次元表を作成してみましょう dim_date_time_segment_utc8
:
UTC + 8日 | 期間 | 開始時間 | 終了時刻 |
---|---|---|---|
2010年10月10日 | 1 | 2019年10月9日夜四時00分00秒 | 2019年10月9日夜11時〇〇分00秒 |
2010年10月10日 | 2 | 2019年10月9日夜11時〇〇分00秒 | 2019年10月10日午前八時00分00秒 |
2010年10月10日 | 3 | 2019年10月10日午前八時00分00秒 | 2019年10月10日夜四時00分00秒 |
私は、開始時刻と終了時刻、およびこの時間は、第二ディメンション表を必要とし、寸法「時間帯」を書き出すために方向転換 dim_time_segment_status_utc8
:
UTC + 8日 | 期間 | 英文 |
---|---|---|
1 | 朝 | 昼前 |
2 | 午後 | 午後 |
3 | 夜間 | 夜 |
徹底的な分析時間
先に述べた我々は時間の最小サイズを見つける必要があり、その後、私たちもそれを行うにはどのように時間の主要な努力を必要としますか?例えば、また月次統計、四半期ごとの統計情報を必要としますか?
二つの方法、過度のテーブルに直接概略構成を説明することなく、さらに演算処理テーブルの数を減らすこと、結合の程度を増加させる最初の方法があります。
UTC + 8日 | 開始時間 | 終了時刻 | 年 | 毎月 | 四半期 |
---|---|---|---|---|---|
2010年10月10日 | 2019年10月9日夜四時00分00秒 | 2019年10月10日夜四時00分00秒 | 2010 | 10 | 1 |
2010年10月11日 | 2019年10月10日夜四時00分00秒 | 2019年10月11日夜四時00分00秒 | 2010 | 10 | 2 |
2010年10月12日 | 2019年10月11日夜四時00分00秒 | 2019年10月12日夜四時00分00秒 | 2010 | 10 | 3 |
2010年10月13日 | 2019年10月12日夜四時00分00秒 | 2019年10月13日夜四時00分00秒 | 2010 | 10 | 4 |
長い一日考えて、私たちは毎日3ヶ月を過ごしてみましょう、右=
もう一つの方法は、時刻表を切り離すことで、我々は入れて、変更されないまま UTC+8日期、年份、月度、季度
別のテーブルとしてこれら3つのフィールド。
唯一のテーブルの束を見て、のが好きなコードを使用する方法を見てみましょう
select dim_invoied_date_time.utc_cn_date as invoiced_date,
dim_invoiced_date_year_month.month as invoiced_month,
dim_invoiced_date_year_month.quarter as invoiced_quarter
from supermarket_sales_order as sales_order
join dim_date_time_utc8 as dim_invoied_date_time
on sales_order.invoiced_time >= date_time.from_time
and sales_order.invoiced_time < date_time.end_time
join dim_date_year_month as dim_invoiced_date_year_month
on dim_invoied_date_time.utc_cn_date = dim_date_year_month.utc_cn_date
コードは、より大きな注意を払うか等しい未満でなければならないので、テーブルは、開始および終了時間の重複に関しため
間で使用する場合の間ではお勧めしません、データベースは、データベース移行を考慮したデータの臨界値に注意を払う必要性を避けるために、現在のプロセスの間に明確な境界でなければなりません
瞬間をつかむために、時間の経過
我々はまた、すべての前に戻って探す必要があり、様々な情報サービスの現在の最終ステータスよりも頻繁に報告書に焦点を当てる必要があります。
スーパーマーケットは、例えば、注文は、我々が持っているなど、私たちのビジネスは、ある時点で、データベース内のすべての変更を記録した場合、多くの州で変え......、返金、支払っ償還た、作成された、注文を取るために継続しますそのようなテーブル:
ORDER_ID | 時間 | 状態 |
---|---|---|
1233 | 2019年10月9日夜四時00分00秒 | 1 |
1233 | 2019年10月10日夜四時00分00秒 | 2 |
1233 | 2019年10月11日夜四時00分00秒 | 3 |
これは、うん、ユーザーの日は非常にためらっているようだ、ステップを行います
1 =作成された2 =が支払われ、3 =を還付:私たちは、ステータステーブルがあるが、以下のマッピング関係を保っていると仮定します
ビジネスだけで、このようなテーブル構造を記録した場合、どのように我々は報告書で、それを適用するのですか?我々は現在の状態を取得するためにここに保存された最大の時間値を検索するために、ここで毎回来るのか、受注時間「支払ためらい期間」に近い二つの状態を見つけることによって計算されますか?
:このオブジェクトの問題は含めて分析、さまざまな行うために速い容易にするために、複数の時点での状態の変化、になるために当前状态
、状态的持续时间
、某一时间点的状态
私たちは紹介し 缓慢变化维
、これらの問題を解決するために(ゆっくりと寸法を変更します)。
SCDのために我々は3つの処理モードがあります:
- 最新の状態に保た:我々は右のみ、その後、最終状況を気にし、すべての直接更新(最新のデータだけが保存されています)
- 期間:我々は、各状態の開始と終了時刻を記録し、最新の状態の終了時刻がnullで、毎回新しいデータが全体の記録の最初の会議の終了時刻です。この方法は、により必要な計算の計算層DW(大量を表示するように見えるように、上記の情報サービスの実行時間(更新操作はデータトラフィックをもたらす)、唯一のサービスレコードまたはテーブルを埋めるために複雑なロジックを分割することです増分計算)。
- チェーンストア:私たちは、時間間隔だけの状態が最後であるかを知る必要があり、またはどのように私たちの状態は常にID内のデータの各エントリの状態を保存する必要があります(ただし、複数のクエリだけにして、スイッチングさを気にしません)過去のデータを変更しません
たとえば、開始時刻と終了時刻:
ORDER_ID | 始まる時間 | 終了時間 | 状態 |
---|---|---|---|
1234 | 2019年10月9日夜四時00分00秒 | 2019年10月10日午後三時59分59秒 | 1 |
1234 | 2019年10月10日夜四時00分00秒 | 2019年10月11日午後三時59分59秒 | 2 |
1234 | 2019年10月11日夜四時00分00秒 | 3 |
END_TIMEはまた次のstart_timeことについて、それは、処理ロジック部の境界問題に影響しますので、あなたは、同じスタイルを保つことができます
最後に、テストに歓迎/次の3つの方法の性能差を計算し、大量のデータを比較します。
-
ときに参加ゾーン変換により、このような時間ディメンション
-
データ変換機能を読んだり、ETLツールでは、SQL時間の計算を表示します
- 時間算出機能ETLツールによって計算された時間内に
|著作権:使用してサイトの記事 CC 4.0 BY-SA契約を ライセンスに、元のソースのリンクと、この文を添付してください、再現。
|このリンク: Cologicブログ - レポートの自動化:瞬間をつかむために、時間の経過 - https://www.coologic.cn/2020/03/1767/