6 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——记录最新记录及上一次历史

 原创于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python与大数据分析

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值