快速理解拉链表(缓慢渐变维度)思想和实现思路

数仓分层:

*根据实际情况分类,也有可能叫其他名字

首先,先得搞明白什么情况下我们需要用到拉链表?

例如:同一条数据我们需要记录不同时间的两个状态。

之前的效果:

订单id创建时间订单状态start_dateend_date
o0012022-01-01已支付2022-01-019999-12-31
o0012022-01-01已发货2022-01-029999-12-31

最终效果:

使用两个时间字段用来标记一条数据的不同状态。

订单id创建时间订单状态start_dateend_date
o0012022-01-01已支付2022-01-012022-01-01
o0012022-01-01已发货2022-01-029999-12-31

那么,怎么把之前第一条记录的时间改为历史状态的时间呢?

实现思路:

        1、第一次拉链表就是全量导入历史数据即可;

        2、之后就是循环拉链表导入数据,将昨天新增和更新的数据增量采集到ODS层分区表的昨天的分区中【start_date:就是昨天的日期】;

        3、将历史拉链表和第2步新采集的表,进行left join,如果右表中的id不为null,那么就证明,这条数据是更新的,那么就把之前数据的end_time,时间修改为昨天的时间就可以了(这里我们用到if 判断函数,if(条件,true的结果,false的结果));

        4、将新采集的表和第3步对有数据更新的表进行union all;

        5、为了保证安全性,一般都是先建立一个临时拉链表,成功之后,只需把临时拉链表的数据覆盖到拉链表就可以了。

代码实现(为方便大家理解,简单的代码仅供参考):

insert overwrite table dwd.fact_shop_order_tmp partition (start_date)
select
	*
from (
   --1、ods表的新分区数据(有新增和更新的数据)
    select
        id,
        create_time,
        order_status,
        '9999-99-99' end_date,
    	'2022-01-02' as start_date
    from ods.t_shop_order
    where dt='2022-01-02'
    --合并
    union all
    -- 2、历史拉链表数据,并根据up_id判断更新end_time有效期
    select
    	fso.id,
        fso.create_time
        fso.order_status,
        --3、更新end_time:如果没有匹配到变更数据,或者当前已经是无效的历史数据,则保留原始end_time过期时间;否则变更end_time时间为前天(昨天之前有效)
    	if (tso.id is null or fso.end_date<'9999-99-99', fso.end_date, date_add(tso.dt, -1)) end_time,
        -- if(条件,true的结果,false的结果)
        -- if(tso.id is not null and fso.end_date = '9999-99-99',date_add(tso.dt, -1), fso.end_date)
    	fso.start_date
    -- 历史拉链表
    from dwd.fact_shop_order fso
    -- 左连接当前最新数据:左表有结果就有,右表没有就为null
    -- 如果左表有并且右表也有:这条数据发生了更新
    left join (
        	select * from ods.t_shop_order where dt='2022-03-20'
         ) tso
    	 on fso.id=tso.id
) his
order by his.id, start_date;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ButterFly0612

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值