您的位置:首页 > 其它

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中维度的建模并没有太大的益处,因为这两套数据只是前后版本的区别,并不存在层次的差别。

代码


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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐