拉链的通常算法
来源:互联网 发布:2016年三大运营商数据 编辑:程序博客网 时间:2024/05/16 23:43
本文中所述的拉链算法,是按照一般性常规思维进行计算的。此过程分3大步,4小步:第一步新增新记录到目标表中,其中包含目标表中没有此主键的记录和断链新增记录两部分内容;第二步将源表已经不存在的记录在目标表中进行行关链;第三步处理变化了属性值的记录:1、关链老数据;2、新开链属性值变化后的数据。
文中所考虑的数据源假设为全量数据;代码中没有体现出数据回滚的过程,这一部分内容可以参考《数据仓库拉链算法在ORACLE中的实现,原文地址:http://blog.csdn.net/nsj820/article/details/5876895》进行一定程度的修改实现,所用到的测试源表、目标表表结构和数据也可参考此博客中的内容。
算法的性能并没有考虑在内,实际项目过程中可根据需要进行选用;存储过程代码的下方也给出了详尽的数据查看语句和批量调度语句代码,可以测试时参考使用。
CREATE OR REPLACE PROCEDURE P_T100_STATUS_H_COMMON(P_ETLDATE VARCHAR2) AS --P_ETLDATE VARCHAR2(8) := '20100108'; --源数据作全量考虑,数据回滚暂未考虑BEGIN --1、EDW表中没有此主键的记录,则确定为新增 INSERT INTO EDW_T100_STATUS_H (ID, STATUS, START_DATE, END_DATE) SELECT O.ID, O.STATUS, TO_DATE(P_ETLDATE, 'YYYYMMDD'), TO_DATE('30001231', 'YYYYMMDD') FROM ODS_XT_ZT O WHERE O.ODS_DATA_DATE = P_ETLDATE AND (NOT EXISTS (SELECT 1 FROM EDW_T100_STATUS_H T WHERE T.ID = O.ID) OR EXISTS --处理数据断链新增的情况 (SELECT 1 FROM (SELECT ID, MAX(END_DATE) END_DATE FROM EDW_T100_STATUS_H GROUP BY ID) T WHERE T.ID = O.ID AND T.END_DATE < TO_DATE(P_ETLDATE, 'YYYYMMDD'))); --2、源表中没有此ID了,则进行关链 UPDATE EDW_T100_STATUS_H T SET T.END_DATE = TO_DATE(P_ETLDATE, 'YYYYMMDD') WHERE T.END_DATE = TO_DATE('30001231', 'YYYYMMDD') AND NOT EXISTS (SELECT 1 FROM ODS_XT_ZT O WHERE T.ID = O.ID AND O.ODS_DATA_DATE = P_ETLDATE); --3.1、EDW表中有此主键的记录,状态值不同,更新结束日期为当天 UPDATE EDW_T100_STATUS_H T SET T.END_DATE = TO_DATE(P_ETLDATE, 'YYYYMMDD') WHERE T.END_DATE = TO_DATE('30001231', 'YYYYMMDD') AND EXISTS (SELECT 1 FROM ODS_XT_ZT O WHERE T.ID = O.ID AND T.STATUS <> O.STATUS AND O.ODS_DATA_DATE = P_ETLDATE); --3.2、新增关链后新开链记录 INSERT INTO EDW_T100_STATUS_H (ID, STATUS, START_DATE, END_DATE) SELECT O.ID, O.STATUS, TO_DATE(P_ETLDATE, 'YYYYMMDD'), TO_DATE('30001231', 'YYYYMMDD') FROM ODS_XT_ZT O WHERE EXISTS (SELECT 1 FROM EDW_T100_STATUS_H T WHERE T.ID = O.ID AND T.STATUS <> O.STATUS AND T.END_DATE = TO_DATE(P_ETLDATE, 'YYYYMMDD') --3.1步刚刚更新过了的日期,而不能是TO_DATE('30001231', 'YYYYMMDD')了 AND O.ODS_DATA_DATE = P_ETLDATE); COMMIT;END; --TRUNCATE TABLE EDW_T100_STATUS_H; --SELECT * FROM ODS_XT_ZT ORDER BY 1,3; --SELECT * FROM EDW_T100_STATUS_H ORDER BY 1,3; /*DECLARE BEGIN FOR V_KEY IN 20100101 .. 20100107 LOOP P_T100_STATUS_H_COMMON(V_KEY); END LOOP; END;*//
- 拉链的通常算法
- 拉链表的展开算法
- 带删除的历史拉链算法
- 数据仓库之拉链算法
- 【ETL】拉链表算法
- 数据仓库之拉链算法
- 数据仓库 拉链算法
- 【ETL】拉链表算法
- 【ETL】拉链表算法
- 数据仓库之拉链算法
- 拉链表算法
- 【ETL】拉链表算法
- ETL拉链算法简介
- 用拉链法实现哈希算法的运算
- 须民的拉链
- ETL拉链算法汇总大全
- 历史拉链表的应用--余额历史中每日平均余额的算法
- python的拉链(zip)
- XP SP3远程桌面无法连接Windows server 2008
- Flex:猜数字小游戏
- 校准linux服务器时间
- vc里几个关闭窗口退出程序的语句
- Flex与js replace方法默认只能替换第一个匹配
- 拉链的通常算法
- 字符编码:ASCII,Unicode和UTF-8
- 浅谈Base64编码
- [AS3]BitmapBytes类-实现BitmapData与ByteArray(Base64)之间互转功能
- C#图像处理
- 全球google服务
- apache+tomcat 配置
- hive细节测试
- Fibonacci数列(四)