Schema

數據倉庫支持票

  • January 16, 2013

我開始為一家公司設計一個數據倉庫。我們試圖解決的第一個問題是關於他們的支持票務系統。我的初始架構如下

倉庫

現在我們要問的問題之一是歷史上有多少票在任何時候都處於活動狀態。

問題是一天會創建一個工單,但可能會在幾天/幾週/幾個月內打開而不會再次更新或創建,這意味著即使每天都打開工單,創建工單時我們也只有一個事實記錄。

我不確定最好的處理方法是什麼,我剛剛想到的就是這個。

在一天開始時,任何未標記為已解決的票證在每天開始時都會在事實表中輸入另一張票證,無論是否有任何更新?這似乎是一個明智的解決方案?還是我錯過了一些更簡單的東西?

任何關於模式的回饋也將不勝感激,因為我們仍然有時間更改它並從一開始就正確處理它。

您可能希望將支持票證事實表分解為事務;使用者 w 在日期 x 將工單 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;

SQL小提琴

引用自:https://dba.stackexchange.com/questions/33013