一、概念
拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。
在历史表中对客户的一生的记录可能就这样几条记录,避免了按每一天记录客户状态造成的海量存储的问题:
(NAME)人名 (START-DATE)开始日期 (END-DT)结束日期 (STAT)状态
client 19000101 19070901 H在家client 19070901 19130901 A小学
client 19130901 19160901 B初中
client 19160901 19190901 C高中
client 19190901 19230901 D大学
client 19230901 19601231 E公司
client 19601231 29991231 H退休在家
上面的每一条记录都是不算末尾的,比如到19070901,client已经在A,而不是H了。所以除最后一条记录因为状态到目前都未改变的,其余的记录实际上在END-DT那天,都不在是该条记录END-DT那天的状态。这种现象可以理解为算头不算尾。
二、算法
1、采集当日全量数据到ND(NewDay)表;
2、可从历史表中取出昨日全量数据存储到OD(OldDay)表;
3、(ND-OD)就是当日新增和变化的数据,也就是当天的增量,用W_I表示;
4、(OD-ND)为状态到此结束需要封链的数据,用W_U表示;
5、将W_I表的内容全部插入到历史表中,这些是新增记录,start_date为当天,而end_date为max值;
6、对历史表进行W_U部份的更新操作,start_date保持不变,而end_date改为当天,也就是关链操作;
拉链表 实际上是一个数据的有效 更新处理方法。 在定义了对于该方法支持的几个字段后可以对数据进行处理。
讲解一个加了几个字段的的一种处理方法
模拟场景
1、定义两个临时表,一个为当日全量数据,另一个为需要新增或更新的数据;
CREATE TABLE A_day_full;
CREATE TABLE B;
2、获取当日全量数据
INSERT INTO A SELECT (a,b,c,cur_date, max_date) FROM SOURCE_Table
3、抽取新增或有变化的数据,从A临时表到B临时表;
INSERT INTO B SELECT fieldname FROM A WHERE NOT IN (select fieldname from A_HIS where end_date='max_date');
4、更新历史表的失效记录的end_date为max值
UPDATE A1 FROM a_his A1, B A2 SET End_Date='current_date' WHERE A1.xx=A2.xx AND A1.End_Date='max_date';
5、将新增或者有变化的数据插入目标表*/
INSERT INTO A_HIS SELECT * FROM B;