關於拉鍊表

(一)概念
      拉鍊表是針對數據倉庫設計中表存儲數據的方式而定義的,顧名思義,所謂拉鍊,就是記錄歷史。記錄一個事物從開始,一直到當前狀態的所有變化的信息。

 

      在歷史表中對客戶的一生的記錄可能就這樣幾條記錄,避免了按每一天記錄客戶狀態造成的海量存儲的問題:
(NAME)人名 (START-DATE)開始日期 (END-DT)結束日期 (STAT)狀態
     client              19000101                         19070901                H在家
     client              19070901                         19130901                A小學
     client              19130901                         19160901                B初中
     client              19160901                         19190901                C高中
     client              19190901                         19230901                D大學
     client              19230901                         19601231                E公司
     client              19601231                         29991231             H退休在家

 

     上面的每一條記錄都是不算末尾的,比如到19070901,client已經在A,而不是H了。所以除最後一條記錄因爲狀態到目前都未改變的,其餘的記錄實際上在END-DT那天,都不在是該條記錄END-DT那天的狀態。這種現象可以理解爲算頭不算尾。


(二)算法
     1、採集當日全量數據到ND(NewDay)表;
     2、可從歷史表中取出昨日全量數據存儲到OD(OldDay)表;
     3、(ND-OD)就是當日新增和變化的數據,也就是當天的增量,用W_I表示;
     4、(OD-ND)爲狀態到此結束需要封鏈的數據,用W_U表示;

     5、將W_I表的內容全部插入到歷史表中,這些是新增記錄,start_date爲當天,而end_date爲max值;
     6、對歷史表進行W_U部份的更新操作,start_date保持不變,而end_date改爲當天,也就是關鏈操作;


(三)一個實際例子(teradata)
     1、定義兩個臨時表,一個爲當日全量數據,另一個爲需要新增或更新的數據;
     CREATE VOLATILE TABLE VT_xxxx_NEW AS xxxx WITH NO DATA ON COMMIT PRESERVE ROWS;
     CREATE VOLATILE SET TABLE VT_xxxx_CHG,NO LOG AS xxxx WITH NO DATA ON COMMIT PRESERVE ROWS;

 

     2、獲取當日全量數據
     INSERT INTO VT_xxxx_NEW(xx) SELECT (xx,cur_date, max_date) FROM xxxx_sorce; ND

 

     3、抽取新增或有變化的數據,從xxxx_NEW臨時表到xxxx_CHG臨時表;
     INSERT INTO VT_xxxx_CHG(xx)
     SELECT xx FROM VT_xxxx_NEW
     WHERE (xx) NOT IN (select xx from xxxx_HIS where end_date='max_date');

 

     4、更新歷史表的失效記錄的end_date爲max值
     UPDATE A1 FROM xxxx_HIS A1, VT_xxxx_CHG A2
     SET End_Date='current_date'
     WHERE A1.xx=A2.xx AND A1.End_Date='max_date';
     5、將新增或者有變化的數據插入目標表*/
     INSERT INTO xxxx_HIS SELECT * FROM VT_xxxx_CHG;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章