如何用SQL語句處理緩慢變化維(漸變維,拉鏈表)SCD-2?


 

假設有一張居民維表,需要記錄居民狀態的變更歷史,根據Kimball建模理論,設計居民維表如下:

image

另外在ODS中有居民信息的每日快照表(每天都記錄一份居民的全量信息):O_USERINFO

image

如何將ODS中的O_USERINFO的每日批次數據加載到居民維表D_RESIDENT_SCD中,需注意兩個表必須在同一個數據源中。

在HHDI中新建數據抽取任務,也可采用執行SQL任務,在源表查詢語句中寫入以下SQL:

SELECT     O.ID RESIDENTID,
     O.NAME,
     O.IDNUMBER,
     O.SEX,
     TO_CHAR(O.BIRTHDAY, 'YYYY/MM/DD') BIRTHDAY,
     AREACODE DIVISIONCODE,
     IFNULL(O.STATUS,-1) STATUS,
     O.CREATETIME,
     O.IMAGEPATH,
     O.CONTACTADDRESS,
     TRUE DIM_FLAG,
     '${HDIBATCHNO}' DIM_STARTTIME,
     '20990101' DIM_ENDTIME
FROM O_USERINFO O
WHERE O.ETLBATCHID = ${HDIBATCHNO}
AND NOT EXISTS (SELECT 1 FROM D_RESIDENT_SCD D WHERE (D.DIM_FLAG=TRUE) AND O.ID = D.RESIDENTID AND IFNULL(O.STATUS,-1) = IFNULL(D.STATUS,-1))
AND NOT EXISTS (SELECT 1 FROM D_RESIDENT_SCD D WHERE ('${HDIBATCHNO}' >=D.DIM_STARTTIME AND '${HDIBATCHNO}' < D.DIM_ENDTIME) AND O.ID = D.RESIDENTID AND IFNULL(O.STATUS,-1) = IFNULL(D.STATUS,-1))

這段SQL的意思是篩選出新增的居民記錄以及居民狀態發生變化的居民信息,其中WHERE語句的最后一個條件的意思是如果重跑n天之前的歷史數據時,將這段時間內的居民狀態發生變化的記錄(和維表比較)篩選出來。如圖:

image

 

在目標頁簽中,在自定義刪除語句中,寫入以下SQL:

UPDATE PUBLIC.D_RESIDENT_SCD D

SET D.STATUS=(SELECT IFNULL(O.STATUS,-1) FROM O_USERINFO O WHERE O.ETLBATCHID = ${HDIBATCHNO} AND D.RESIDENTID=O.ID AND IFNULL(O.STATUS,-1) <> IFNULL(D.STATUS,-1))
WHERE D.DIM_FLAG=FALSE
AND '${HDIBATCHNO}' >=D.DIM_STARTTIME AND '${HDIBATCHNO}' < D.DIM_ENDTIME
AND EXISTS (SELECT 1 FROM O_USERINFO O WHERE O.ETLBATCHID = ${HDIBATCHNO} AND D.RESIDENTID=O.ID AND IFNULL(O.STATUS,-1) <> IFNULL(D.STATUS,-1))
;


UPDATE PUBLIC.D_RESIDENT_SCD D
SET DIM_FLAG=FALSE,DIM_ENDTIME='${HDIBATCHNO}'
WHERE D.DIM_FLAG=TRUE
AND D.DIM_STARTTIME<='${HDIBATCHNO}'
AND EXISTS (
SELECT 1 FROM O_USERINFO O
WHERE O.ETLBATCHID = ${HDIBATCHNO}
AND D.RESIDENTID=O.ID
AND IFNULL(O.STATUS,-1) <> IFNULL(D.STATUS,-1))
;

這兩個SQL的意思是修改已存在的且狀態發生變化的居民維度記錄的有效標志和有效時間段,第一個UPDATE語句是跑歷史數據時需要執行的,第二個語句是用來跑最新數據的,如圖:

image

這樣最終在執行任務的時候,先執行兩個UPDATE語句,然后再執行INSERT語句將之前SELECT的數據插入到居民維表。

如果是執行SQL任務的話,就是兩個UPDATE語句加一個INSERT語句即可。

數據庫中該維表寫入后的結果如圖所示:

image

 

 HaoheDI(昊合數據整合平台)

是一款基於B/S架構的輕量級ETL工具,開發運維均極為簡單,幫您快速搭建ETL平台,廣泛支持各種數據庫、文本文件、SAP和Hadoop,開發數據轉換只需熟悉SQL開發即可,可輕松調度Kettle的轉換和作業,並提供圖形化的作業流程設計界面,以及可視化的任務作業管理、計划調度、實時監控、消息提醒和日志分析,有效彌補傳統ETL工具在調度管理和監控分析等方面的不足,大幅降低您的開發和運維成本,產品還提供數據質量和血緣分析等其它功能,詳情可通過官網 http://www.haohedi.com 進行了解和在線體驗

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM