insert into demo.dw_product
select
goods_id,
goods_status,
createtime,
modifytime,
modifytime as 'dw_start_date',
'9999-12-31' as 'dw_end_date'
from demo.ods_product;
insert into demo.ods_product select * from demo.t_product;
接下来 保存 新增的数据到拉链表中,同时 修改 已经发生变化的数据 并修改end时间戳
1. 先把之前的历史数据结束时间修改掉 left join
select
dw.goods_id,
dw.goods_status,
dw.createtime,
dw.modifytime,
dw.dw_start_date,
-- 右表ods的ID 进行关联 不为null,并且dw的结束时间为9999-12-31
# 不为null 表示 左边也有这条数据 ,结束时间为9999-12-31 说明是最新的/上一条 数据 我们进行判断修改
case when (ods.goods_id is not null and dw.dw_end_date = '9999-12-31')
then ods.modifytime
else dw.dw_end_date
end as dw_end_date
from demo.dw_product dw
left join
(select * from demo.ods_product where modifytime='2019-12-20') ods
on dw.goods_id = ods.goods_id;
/*
001 待审核 2019-12-18 2019-12-20 2019-12-20 2019-12-21 可以看出 001 发生数据被修改
002 待售 2019-12-19 2019-12-20 2019-12-20 2019-12-20
003 在售 2019-12-20 2019-12-20 2019-12-20 2019-12-20
004 已删除 2019-12-15 2019-12-20 2019-12-20 2019-12-20
*/
2. 关联新增的数据 用union
还是 之前创建的 那块代码 照搬
/*
select
ods.goods_id, -- 商品编号
ods.goods_status, -- 商品状态
ods.createtime, -- 商品创建时间
ods.modifytime, -- 商品的修改时间
ods.modifytime as dw_start_date,
'9999-12-31' as dw_end_date
from demo.ods_product ods where modifytime = '2019-12-21';
*/
实现
insert into demo.dw_product
-- 1. 先把之前的历史数据结束时间修改掉
select
dw.goods_id,
dw.goods_status,
dw.createtime,
dw.modifytime,
dw.dw_start_date,
-- 右表ods的ID 进行关联 不为null,并且dw的结束时间为9999-12-31
# 不为null 表示 左边也有这条数据 ,结束时间为9999-12-31 说明是最新的/上一条 数据 我们进行判断修改
case when (ods.goods_id is not null and dw.dw_end_date = '9999-12-31')
then ods.modifytime
else dw.dw_end_date
end as dw_end_date
from demo.dw_product dw
left join
(select * from demo.ods_product where modifytime='2019-12-20') ods
on dw.goods_id = ods.goods_id
-- 2. 关联本次新增数据
union all
select
ods.goods_id,
ods.goods_status,
ods.createtime,
ods.modifytime,
ods.modifytime as dw_start_date,
'9999-12-31' as dw_end_date
from demo.ods_product ods where modifytime = '2019-12-21';