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 天的数据,同时补录的数据也进行了重新的汇总计算,如下图所示: