6 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——记录最新记录及上一次历史
2009-10-15 09:26
721 查看
原创于2006年12月09日,2009年10月15日迁移至此。
此
种方式是缓慢变化维中较为折中的做法,但需要表结构随之适应。它的原理是把目标表字段扩充一倍,其中一组用来记录最新的记录信息,另一组用来记录上一次的
历史记录。新记录插入时,将其插入到最新记录的位置,一旦记录发生改变,修改后的记录变为最新记录,则把修改后记录替换原来的记录,放在最新记录位置,同
时把原记录移至旧记录位置。
3.3.3
记录最新记录及上一次历史(
Type 3 Dimension -- keep the current and previous values in the target
)
此
种方式是缓慢变化维中较为折中的做法,但需要表结构随之适应。它的原理是把目标表字段扩充一倍,其中一组用来记录最新的记录信息,另一组用来记录上一次的
历史记录。新记录插入时,将其插入到最新记录的位置,一旦记录发生改变,修改后的记录变为最新记录,则把修改后记录替换原来的记录,放在最新记录位置,同
时把原记录移至旧记录位置。
这种方式,对于那些不是需要所有历史信息的表可以适用,但同时带来的是表结构需要
相应的调整,增加相同的一组字段,在字段本身就多的情况下,其新表的字段数将是源表字段数
*2
,故使用此种方式需要斟酌。
同时采用此方法对于
OLAP中维度的建模并没有太大的益处,因为这两套数据只是前后版本的区别,并不存在层次的差别。
代码
备注:
文档中所有代码均可执行,且执行步骤均相同,以下附调用代码
此
种方式是缓慢变化维中较为折中的做法,但需要表结构随之适应。它的原理是把目标表字段扩充一倍,其中一组用来记录最新的记录信息,另一组用来记录上一次的
历史记录。新记录插入时,将其插入到最新记录的位置,一旦记录发生改变,修改后的记录变为最新记录,则把修改后记录替换原来的记录,放在最新记录位置,同
时把原记录移至旧记录位置。
3.3.3
记录最新记录及上一次历史(
Type 3 Dimension -- keep the current and previous values in the target
)
此
种方式是缓慢变化维中较为折中的做法,但需要表结构随之适应。它的原理是把目标表字段扩充一倍,其中一组用来记录最新的记录信息,另一组用来记录上一次的
历史记录。新记录插入时,将其插入到最新记录的位置,一旦记录发生改变,修改后的记录变为最新记录,则把修改后记录替换原来的记录,放在最新记录位置,同
时把原记录移至旧记录位置。
这种方式,对于那些不是需要所有历史信息的表可以适用,但同时带来的是表结构需要
相应的调整,增加相同的一组字段,在字段本身就多的情况下,其新表的字段数将是源表字段数
*2
,故使用此种方式需要斟酌。
同时采用此方法对于
OLAP中维度的建模并没有太大的益处,因为这两套数据只是前后版本的区别,并不存在层次的差别。
代码
CREATE TABLE t_dem_xxx ( ID VARCHAR(20) NOT NULL, Name1 VARCHAR(50), Name2 VARCHAR(50), PreName1 VARCHAR(50), PreName2 VARCHAR(50), CONSTRAINT PK_t_dem_xxx PRIMARY KEY (ID) ) go CREATE TABLE t_tmp_xxx ( ID VARCHAR(20) NOT NULL, Name1 VARCHAR(50), Name2 VARCHAR(50), CONSTRAINT PK_t_tmp_xxx PRIMARY KEY (ID) ) go CREATE PROCEDURE p_dem_xxx AS -- 维度抽取存储过程 BEGIN DECLARE @num NUMERIC(10,0) SELECT @num = COUNT(*) FROM t_dem_xxx -- 如果原表为空,构造缺省值 IF @num = 0 BEGIN INSERT INTO t_dem_xxx (ID,Name1,Name2) SELECT '-2','NULL 值 ','' INSERT INTO t_dem_xxx (ID,Name1,Name2) SELECT '-1',' 缺失外键 ','' END -- 根据主键插入在维度表中找不到的基础数据 INSERT INTO t_dem_xxx ( ID , Name1 , Name2 ) SELECT a.ID,a.Name1,a.Name2 FROM t_tmp_xxx a LEFT OUTER JOIN t_dem_xxx b ON a.ID = b.ID WHERE b.ID IS NULL -- 根据主键更新在维度表中找到但是已经发生变化的的基础数据,重新设置数据 UPDATE t_dem_xxx SET Name1 = a.Name1, Name2 = a.Name2, PreName1 = b.Name1, PreName2 = b.Name2 FROM t_tmp_xxx a,t_dem_xxx b WHERE a.ID = b.ID AND (a.Name1<>b.Name1 or a.Name2<>b.Name2) END |
文档中所有代码均可执行,且执行步骤均相同,以下附调用代码
-- 第一次执行插入操作 INSERT INTO t_tmp_xxx VALUES ('1','AA','') INSERT INTO t_tmp_xxx VALUES ('2','BB','') EXEC p_dem_xxx SELECT * FROM t_dem_xxx SELECT * FROM t_tmp_xxx -- 更新数据后的变化 UPDATE t_tmp_xxx SET Name2 = 'A' WHERE ID = '1' EXEC p_dem_xxx SELECT * FROM t_dem_xxx SELECT * FROM t_tmp_xxx |
相关文章推荐
- 6 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——记录最新记录及上一次历史
- 5 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——全历史记录
- 5 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——全历史记录
- 3 关于数据仓库维度数据处理的方法探究系列——缓慢变化维概述和原理
- 3 关于数据仓库维度数据处理的方法探究系列——缓慢变化维概述和原理
- 4 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——覆盖方式
- 4 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——覆盖方式
- 2 关于数据仓库维度数据处理的方法探究系列——无变化维度处理
- 9 关于数据仓库维度数据处理的方法探究系列——雪花维
- 1 关于数据仓库维度数据处理的方法探究系列——维的概述
- 7 关于数据仓库维度数据处理的方法探究系列——急剧变化维概述
- 1 关于数据仓库维度数据处理的方法探究系列——维的概述
- 7 关于数据仓库维度数据处理的方法探究系列——急剧变化维概述
- 8 关于数据仓库维度数据处理的方法探究系列——父子维
- 8 关于数据仓库维度数据处理的方法探究系列——父子维
- 2 关于数据仓库维度数据处理的方法探究系列——无变化维度处理
- 9 关于数据仓库维度数据处理的方法探究系列——雪花维
- [数据仓库--ETL]渐变维度(Slowly Changing Dimension)及其处理方法
- [数据仓库--ETL]渐变维度(Slowly Changing Dimension)及其处理方法
- 关于ubifs在断电时丢失数据的处理方法