致力做一个首先想的是怎么帮助别人的人
点赞再看,帮我个忙
前言
刚工作的时候,有个厉害的同学比我先去公司实习,回到学校就跟我说拉链表的有关知识,而且后来跳槽面试时也被问到拉链表,所以想写一下拉链表,希望能帮到万一面试也被问到拉链表的同学。
为什么要用拉链表
比如银行评价一个客户的等级,是根据客户的资产多少来评定的,而且根据国家经济情况变化而需要调整的。
所以你需要一个能够反映等级评分历史变化的表:
等级代号 | 等级名称 | 资产范围 | 生效时间 | 失效时间 |
---|---|---|---|---|
A | 低价值客户 | 0~5000 | 2000/1/1 | 2015/2/1 |
A | 低价值客户 | 0~10000 | 2015/2/2 | 2099/12/31 |
B | 潜力客户 | 10000~50000 | 2000/1/1 | 2099/12/31 |
表中数据反应了银行评定客户等级的标准,等级A(低价值客户),在2000/1/1日至2015/2/1日之间,资产低于5000的客户为级别A,在2015年2月2日将A等级的资产范围调整为低于10000,像这种可以反应历史变化的数据表就是拉链表了。
如何使用拉链表
可以注意到,拉链表会有两个时间字段,生效时间和失效时间,表示当前记录的有效期,而且同一等级的生效时间和失效时间是首尾相连的,也就是说同一等级在确定的时间点可以找到确定的资产范围,这样也就达到了历史可查的效果。
如何更新拉链表
比如上面表格,一开始表中只有一条等级A的数据
等级代号 | 等级名称 | 资产范围 | 生效时间 | 失效时间 |
---|---|---|---|---|
A | 低价值客户 | 0~5000 | 2000/1/1 | 2099/12/31 |
在2015年2月2日要更新等级A的资产范围为0~10000,
第一步:匹配表中是否有等级代号等于A的记录,
- 如果没有,则直接插入生效时间为2015/2/2日,失效时间为2099/12/31的一条记录即可;
- 如果匹配到有,则将等级代号等于A并且失效时间为2099/12/31的记录闭链,即将该条记录的失效时间更新为2015/2/1日,最后插入生效时间为2015/2/2日,失效时间为2099/12/31的一条记录。
等级代号 | 等级名称 | 资产范围 | 生效时间 | 失效时间 |
---|---|---|---|---|
A | 低价值客户 | 0~5000 | 2000/1/1 | 2015/2/1 |
A | 低价值客户 | 0~10000 | 2015/2/2 | 2099/12/31 |
附上更新代码
v_count number;
select count(1) into v_count
from t_grades
where grade_code = 'A' ;
if v_count > 0 then
update t_grades
set end_date = '2015/2/1'
where grade_code = 'A'
and end_date = '2099/12/31';
commit;
end if;
insert into t_grades
values('A','低价值客户','0~10000','2015/2/2','2099/12/31');
commit;