会社のデータウェアハウスの設計を始めています。私たちが解決しようとしている最初の質問は、彼らのサポートチケットシステムに関するものです。私の最初のスキーマは次のとおりです
今、私たちが尋ねたい質問の1つは、歴史的に、いつでもアクティブだったチケットの数です。
問題は、チケットが1日作成されるが、更新または再作成されずに数日/週/月にわたって開かれる可能性があることです。つまり、チケットが毎日開かれていても、チケットが作成されたときのファクトレコードは1つだけです。
これを処理する最良の方法が何であるかはわかりませんが、私が思いついたのはこれです。
1日の開始時に、解決済みとしてマークされていないチケットは、更新があるかどうかに関係なく、毎日の開始時にファクトテーブルに別のチケットが入力されていますか?それは賢明な解決策のように見えますか?それとも私はもっと簡単なものが欠けていますか?
スキーマを変更して最初から正しく取得する時間はまだあるので、スキーマに関するフィードバックも大歓迎です。
サポートチケットのファクトテーブルをトランザクションに分解することをお勧めします。日付xのユーザーwは、チケットyを状態zなどに移動しました。これにより、サービスデスクマネージャーが常に熱心に思われる「バウンスされたチケット」などのメトリックが容易になります。これは、すでに持っている累積スナップショットテーブルで補足できます。ここを見てください http://www.kimballgroup.com/2012/05/01/design-tip-145-time-stamping-accumulating-snapshot-fact-tables/ 実装するいくつかのオプションについてこのシナリオ。
特定の日にアクティブなチケットの数を知るには、チケットが最初にアクティブになったときと閉じられたときの両方を知る必要があります。デザインにはすでにこのデータが含まれているため、データを追加せずにカウントを生成できます。これは、オープンとクローズの間の日数を計算し、それを最長のオープン期間に対応するのに十分な大きさのデータセットと結合することで実行できます。これは、概念的に類似したことを行うOracleの例です。
DROP TABLE Tickets;
CREATE TABLE Tickets (ID Number(10), CreateDate Date, CloseDate Date);
INSERT INTO Tickets VALUES (1, to_date('12/30/2012','MM/DD/YYYY')
, to_date('12/31/2012','MM/DD/YYYY'));
INSERT INTO Tickets VALUES (2, to_date('12/30/2012','MM/DD/YYYY')
, to_date('01/05/2013','MM/DD/YYYY'));
INSERT INTO Tickets VALUES (3, to_date('12/30/2012','MM/DD/YYYY')
, NULL);
INSERT INTO Tickets VALUES (4, to_date('12/31/2012','MM/DD/YYYY')
, to_date('01/01/2013','MM/DD/YYYY'));
INSERT INTO Tickets VALUES (5, to_date('12/31/2012','MM/DD/YYYY')
, NULL);
INSERT INTO Tickets VALUES (6, to_date('12/31/2012','MM/DD/YYYY')
, NULL);
INSERT INTO Tickets VALUES (7, to_date('01/01/2013','MM/DD/YYYY')
, to_date('01/20/2013','MM/DD/YYYY'));
INSERT INTO Tickets VALUES (8, to_date('01/01/2013','MM/DD/YYYY')
, to_date('01/02/2013','MM/DD/YYYY'));
INSERT INTO Tickets VALUES (9, to_date('01/01/2013','MM/DD/YYYY')
, NULL);
INSERT INTO Tickets VALUES (10, to_date('01/01/2013','MM/DD/YYYY')
, NULL);
INSERT INTO Tickets VALUES (11, to_date('01/01/2013','MM/DD/YYYY')
, NULL);
INSERT INTO Tickets VALUES (12,to_date('01/01/2013','MM/DD/YYYY')
, to_date('01/04/2013','MM/DD/YYYY'));
INSERT INTO Tickets VALUES (13, to_date('01/02/2013','MM/DD/YYYY')
, to_date('01/20/2013','MM/DD/YYYY'));
COMMIT;
SELECT ActiveDate, count(*) FROM
(
SELECT ID, CreateDate, CreateDate-1+x ActiveDate, NVL(CloseDate,TRUNC(sysdate)) CloseDate
FROM Tickets
JOIN (SELECT Level x FROM dual CONNECT BY Level < 999)
ON x <= (NVL(CloseDate,TRUNC(sysdate)) - CreateDate)
)
GROUP BY ActiveDate ORDER BY ActiveDate;