面试经常被问到-拉链表

致力做一个首先想的是怎么帮助别人的人
点赞再看,帮我个忙

前言

刚工作的时候,有个厉害的同学比我先去公司实习,回到学校就跟我说拉链表的有关知识,而且后来跳槽面试时也被问到拉链表,所以想写一下拉链表,希望能帮到万一面试也被问到拉链表的同学。

为什么要用拉链表

比如银行评价一个客户的等级,是根据客户的资产多少来评定的,而且根据国家经济情况变化而需要调整的。

所以你需要一个能够反映等级评分历史变化的表:

等级代号等级名称资产范围生效时间失效时间
A低价值客户0~50002000/1/12015/2/1
A低价值客户0~100002015/2/22099/12/31
B潜力客户10000~500002000/1/12099/12/31

表中数据反应了银行评定客户等级的标准,等级A(低价值客户),在2000/1/1日至2015/2/1日之间,资产低于5000的客户为级别A,在2015年2月2日将A等级的资产范围调整为低于10000,像这种可以反应历史变化的数据表就是拉链表了。

如何使用拉链表

可以注意到,拉链表会有两个时间字段,生效时间和失效时间,表示当前记录的有效期,而且同一等级的生效时间和失效时间是首尾相连的,也就是说同一等级在确定的时间点可以找到确定的资产范围,这样也就达到了历史可查的效果。

如何更新拉链表

比如上面表格,一开始表中只有一条等级A的数据

等级代号等级名称资产范围生效时间失效时间
A低价值客户0~50002000/1/12099/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~50002000/1/12015/2/1
A低价值客户0~100002015/2/22099/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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值