1. 概述
1.1 應用場景
使用者業務系統訂單表包含:訂單ID、訂單金額、訂單交易日期、訂單建立日期。正常情況下「訂單交易日期」和「訂單建立日期」在同一天,但可能會存在業務人員補錄訂單的情況,比如原本 5.1號交易的資料,在 5.10 號才補錄進系統,此時訂單建立日期為 5.10 號,訂單交易日期為 5.1 號。
在搭建數倉的時候,ODS 層資料按照訂單建立日期做增量更新,可正常進行更新;
DM 層資料按照「交易日期」按日匯總每日的訂單金額,並設定每次調度增量更新訂單交易日期前五天的資料,但是由於補錄資料不確定補錄時間,例如 5.16 日更新前 5 天的資料,但5.16 日補錄了「訂單交易日期」為 5.1、5.2 日的資料,此時先刪後更新的增量更新方案無法對補錄的資料進行增量同步。
注:標黃為 5.16 補錄的歷史交易資料。

1.2 解決思路
首先對於沒有補錄的對應「訂單交易日期」資料增量更新近 5 天的資料。
篩選出「訂單建立日期」>「訂單交易日期」的訂單,取出其中的交易日期,代表此交易日期補錄了資料,需要重新計算按日匯總訂單金額。
1.3 任務展示
FineDataLink 中的資料處理程式,詳情參見:https://demo.finedatalink.com/ 「場景案例 / 數倉搭建與資料更新 / 資料倉儲調度範例 / 訂單補錄資料按日匯總增量更新方案」。
具體如下圖所示:

2. 操作步驟
範例:定時增量更新訂單資料表中前五天的資料,同時如果涉及到增量更新時間外的「訂單交易日期」補錄資料,也能對其更新匯總的訂單金額。
例如5.16日更新前 5 天的資料,但5.16日補錄了「訂單交易日期」為 5.1、5.2 日的資料,要將其同時增量更新。
更新前 ZISJ_order 資料表如下圖所示:
注:標黃為 5.16 補錄的歷史交易資料。

按日匯總銷售資料 ZISJ_order_sum 如下圖所示:

需要將補錄資料和近5天的交易資料均增量更新到資料表,結果如下圖所示:

2.1 增量更新前五天的資料
建立定時任務,拖入「SQL腳本」,腳本配置刪除按日匯總銷售額裏近5天內的交易資料。
MySQL 語句:
DELETE FROM ZJSJ_order_sum
WHERE date >= CURDATE() - INTERVAL 5 DAY;

新增「資料同步」節點,重新計算近5天內的訂單交易匯總資料,並寫入匯總表,實現增量更新,如下圖所示:
MySQL 語句:
SELECT DATE(訂單交易日期) AS date, SUM(money) AS total_money
FROM ZJSJ_order
WHERE 訂單交易日期 >= CURDATE() - INTERVAL 5 DAY -- 選擇最近5天的記錄
GROUP BY DATE(訂單交易日期)

點選資料預覽即可看到訂單交易日期近五天的按日匯總銷售額,如下圖所示:

將資料寫入匯總表,並設定寫入方式為直接將資料寫入目標表,同時當「訂單交易日期」資料衝突時,寫入的資料改寫已有資料,實現增量資料更新,如下圖所示:

2.2 獲取補錄資料的日期並重新計算
新增「參數指派」,從 ZISJ_order 表中獲取「訂單建立日期」大於「訂單交易日期」的資料,也就是篩選出補錄訂單的日期,如下圖所示:
MySQL 語句:
SELECT DATE(訂單交易日期) AS jy_date_list
FROM ZJSJ_order
WHERE DATE(訂單建立日期) > DATE(訂單交易日期)
GROUP BY DATE(訂單交易日期)

點選資料預覽,如下圖所示:

將其設定為參數,如下圖所示:
注:這裏新增了閉包符,且引用多個參數值

新增「資料同步」節點,傳入補錄的日期,從訂單交易日期按日匯總銷售額資料中篩選並計算出補錄資料的按日匯總值,如下圖所示:
MySQL 語句:
SELECT DATE(訂單交易日期) AS date, SUM(money) AS total_money
FROM ZJSJ_order
WHERE DATE(訂單交易日期) IN (${new_date}) -- 指定日期值
GROUP BY DATE(訂單交易日期)

點選資料預覽查看資料,如下圖所示:

將補錄資料寫入匯總表,如下圖所示:

2.3 運作任務
運作任務後,即可看到增量更新近 5 天的資料,同時補錄的資料也進行了重新的匯總計算,如下圖所示:

