全历史记录是缓慢变化维中最为强大的一种加载方式。它将可以完全实现覆盖方式能实现的加载方式,且可以实现对数据的历史记录,可以记录下每一个数据的细微变化。
3.3.2 全历史记录( Type 2 Dimension -- keep a full history of changes in the target )
全历史记录是缓慢变化维中最为强大的一种加载方式。它将可以完全实现覆盖方式能实现的加载方式,且可以实现对数据的历史记录,可以记录下每一个数据的细微变化。通过比对,如发现数据仓库中当前数据已为旧数据,则对当前已有记录进行旧数据标记,主键值不变,同时把修改过的数据作为新的一条数据插入,并赋予新的代理主键值;如发现有新数据,则把新数据加载到数据仓库中,并赋予新的代理主键值。通俗地说,就是指对于源表中的同一条数据,目标(数据仓库)中会根据变化保留下多条,即记录下每次的变化,并对最新的一条进行标记。
而对于全历史记录,根据数据仓库建模思想,又可采取三种记录方式。版本号方式、标志方式及时戳方式。
1. 版本号方式
需要在目标表中增加版本号字段,用于记录该数据的版本号。
采用该方式,可以根据记录的版本号对比,版本号最大的将是最新的记录,而数据的历史信息,可以由版本号的递增得出或者数据库的递增字段特性来实现。
2. 标志方式
需要在目标表中增加标志字段,用于标记同样的数据那一条是最新记录。
采用该方式,根据标志字段值即可得出当前最新记录,如标志为 1的表示为最新记录,标志为 0的为历史信息,历史信息可由其主键值大小得出历史记录的先后。
3. 时戳方式
需要在目标表中增加起始时间及结束时间字段,用于标记该条记录抽取进入目标表的时间及因为其数据被更改后,变为历史数据的时间。
采用该方式,根据其开始时间及结束时间字段来得到当前最新记录,即结束时间为空的就是最新的记录,其余的填入结束时间的记录,可以根据时间的先后,得出历史信息的演变。而此种方式因为利用了时间字段,也详细记录下了历史信息的演变时间,是缓慢变化维中最为强大的一种加载方式,它记录的信息也是最全的。
下面分别对三种方式作一个详细说明:
3.3.2 .1 版本号方式
    它的操作方式与覆盖方式相同之处在于对新增数据的处理,只是根据原主键进行判断后进行数据的插入处理,代理主键利用数据库的 Identity类型字段进行自动生成。
主要差别在于对更新字段数据的处理,它的操作方式为,为了每条记录预留相当部分的版本空间如 1000,对于不同的两条记录,其进入数据库后代理主键的相差值将是 1000,而中间的这些值,既是留给每条记录的版本空间。当进入为新数据时,系统根据上一个序列号值 *1000,产生新记录的代理主键值,并插入目标表。当发现是已有的数据发生改变,则把修改后的数据插入目标表,其代理主键值取原记录值的代理主键值 +1,而版本号亦是取原记录的版本号 +1,每条新记录的版本号均是从 0开始编号。
以上方法需要利用游标进行逐条数据处理,性能不高;同时为了简化处理本例子采用系统步增列进行代理主键的生成,插入时默认从 1~N依次插入,当发现已有数据改变时,把修改的数据插入目标列,其代理主键自动取最大的主键值 +1,这样对于同一条记录最后更新的过的对应到维度表的记录必然是 ID值相同主键值最大的那条记录。
代码
-- 关于维度表的设计是版本方式,标志方式,时戳方式的合集,后续不再重复建表
CREATE TABLE t_dem_xxx
(
SurID INT IDENTITY(1,1),
-- 缓慢维度变化中的代理键 , 也可以采用非递增字列,为简单起见最好使用递增字段
ID VARCHAR(20) NOT NULL,
Name1 VARCHAR(50),
Name2 VARCHAR(50),
IsNew BIT, -- 标志方式类型中标志字段 是否为最新 0 否, 1 是
BeginDate DATETIME, -- 时戳方式类型中开始时间
EndDate DATETIME, -- 时戳方式类型中结束时间
CONSTRAINT PK_t_dem_xxx PRIMARY KEY (SurID)
)
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

-- 根据主键插入在维度表中找到但是已经发生变化的的基础数据
INSERT INTO t_dem_xxx
(
ID ,
Name1 ,
Name2
)
SELECT a.ID,a.Name1,a.Name2
FROM t_tmp_xxx a JOIN t_dem_xxx b
ON a.ID = b.ID
WHERE a.Name1<>b.Name1 OR a.Name2<>b.Name2

END
3.3.2 .2标志 方式
    它的操作方式类似版本号方式,为每条记录预留 1000个变化空间或者为步增方式递增。新记录的插入代理主键的产生类似版本号方式,以 1000为倍数增加,而其新记录标志设置为 1,而当为旧数据时,一旦发现数据被更改过,则把该修改后的数据新插入目标,代理主键值取旧数据代理主键 +1或者取最大值然后 +1,并同时找到旧数据,更新其标志位为 0。
代码

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,IsNew) SELECT '-2','NULL 值 ','',1
INSERT INTO t_dem_xxx (ID,Name1,Name2,IsNew) SELECT '-1',' 缺失外键 ','',1
END

-- 根据主键插入在维度表中找不到的基础数据
INSERT INTO t_dem_xxx
(
ID ,
Name1 ,
Name2 ,
IsNew
)
SELECT a.ID,a.Name1,a.Name2,1
FROM t_tmp_xxx a LEFT OUTER JOIN t_dem_xxx b
ON a.ID = b.ID
WHERE b.ID IS NULL

-- 根据主键更新在维度表中找到但是已经发生变化的的基础数据的标志位为 0
UPDATE t_dem_xxx
SET IsNew = 0
FROM t_tmp_xxx a,t_dem_xxx b
WHERE a.ID = b.ID
AND (a.Name1<>b.Name1 or a.Name2<>b.Name2)

-- 根据主键插入在维度表中找到但是已经发生变化的的基础数据
INSERT INTO t_dem_xxx
(
ID ,
Name1 ,
Name2 ,
IsNew
)
SELECT a.ID,a.Name1,a.Name2,1
FROM t_tmp_xxx a JOIN t_dem_xxx b
ON a.ID = b.ID
WHERE a.Name1<>b.Name1 OR a.Name2<>b.Name2

END
 
3.3.2 .3 时戳方式
 
它的操作方式为当新记录插入时,取系统的当前时间,为其置上开始时间,此时其结束时间为空,当为旧数据时,把修改后的数据插入目标,代理主键由序列号生成器顺序产生,同时找到旧数据,更新其结束时间为当前系统时间。这种方式在系统中,只要结束时间为空的即是当前的最新值,而旧数据也可根据其开始时间结束时间看出它的实效空间,及旧数据的先后顺序。
     全历史记录的方式是缓慢变化维的最为强大的一种记录方式,由于其设计的精妙,可以完全冗余发生的在抽取过程中出现的灾难事故及数据恢复工作,即使在运行过程中发生了断电等事故,我们完全不需要去关系,抽取到底进行到那个步骤,抽取了多少,目标插入了多少。。。。。。我们只要在环境恢复后,重新运行抽取,即可重新完成数据的整合。
代码
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,BeginDate)
SELECT '-2','NULL 值 ','',GETDATE()
INSERT INTO t_dem_xxx (ID,Name1,Name2,BeginDate)
SELECT '-1',' 缺失外键 ','',GETDATE()
END

-- 根据主键插入在维度表中找不到的基础数据
INSERT INTO t_dem_xxx
(
ID ,
Name1 ,
Name2 ,
BeginDate
)
SELECT a.ID,a.Name1,a.Name2,GETDATE()
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 EndDate = GETDATE()
FROM t_tmp_xxx a,t_dem_xxx b
WHERE a.ID = b.ID
AND (a.Name1<>b.Name1 or a.Name2<>b.Name2)

-- 根据主键插入在维度表中找到但是已经发生变化的的基础数据
INSERT INTO t_dem_xxx
(
ID ,
Name1 ,
Name2 ,
BeginDate
)
SELECT a.ID,a.Name1,a.Name2,GETDATE()
FROM t_tmp_xxx a JOIN t_dem_xxx b
ON a.ID = b.ID
WHERE a.Name1<>b.Name1 OR a.Name2<>b.Name2

END

5 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——全历史记录...相关推荐

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

    此种方式是缓慢变化维中较为折中的做法,但需要表结构随之适应.它的原理是把目标表字段扩充一倍,其中一组用来记录最新的记录信息,另一组用来记录上一次的历史记录.新记录插入时,将其插入到最新记录的位置,一旦 ...

  2. 3 关于数据仓库维度数据处理的方法探究系列——缓慢变化维概述和原理

    缓慢变化维 Slowly Changing Dimensions( A typical slowly changing dimension is a product dimension in whic ...

  3. 2 关于数据仓库维度数据处理的方法探究系列——无变化维度处理

    无变化维度一般都是比较简单的维度,都是经过一次性处理后就不再变化的数据:通常这些维度都是一些常识数据 (如性别,重要程度 )和分段数据 (为了减少单层维度的数量,按照一定业务标准进行的人为分组 ). ...

  4. 1 关于数据仓库维度数据处理的方法探究系列——维的概述

    在数据仓库中,维度是数据仓库概念的一个重要基础,因此维度的抽取和处理是一个重要的环节,对于不同的维度根据业务需求以及客观原因有许多不同的处理方式,以下将以SQLServer2000语法为例展开. 1 ...

  5. 8 关于数据仓库维度数据处理的方法探究系列——父子维

    父子维度通俗的话来讲,这个表是自反的,即外键本身就是引用的主键:类似这样的关系,如公司组织结构,分公司是总公司的一部分,部门是分公司的一部分,当然如果定义得好的话员工是部门的一部分:通常公司的组织架构 ...

  6. blog-数据仓库维度建模系列--缓慢变化维(SCD)的思考(一)

    缓慢变化维(Slowly Changing Dimensions) 缓慢变化维是维度技术中用于描述维度变化情况的一种分类. 什么是SDC? 在现实的实施中 先说一下缓慢变化维的概念.缓慢变化维(Slo ...

  7. 吴乙己的数仓指南_5.1维度建模技巧之SCD2类型缓慢变化维搭建

    目录 0.引言 1.SCD类型 2.举个栗子 3.SCD2 3.1 什么是SCD2 3.2 如何使用SCD2 3.3 如何实现SCD2 3.3.1 获取维度基准 3.3.2 按情况分治打标 3.3.3 ...

  8. Kettle使用_22 维度更新 缓慢变化维 拉链表

    Kettle使用_22 维度更新 Type2 拉链表 需求:通过Kettle实现对员工维度数据的更新和插入. 解决方法:通过维度查询更新组件实现. 注:补充部分有SQL版Type2实现代码. Prev ...

  9. 大数据学习(三十一)数据仓库如何处理缓慢变化维

    以下内容结合了<大数据之路-阿里巴巴大数据实践>书中的内容,就如何处理缓慢变化维话题进行展开. 前言:维度的属性也是会发生变化的,只不过相较于事实表而言,变化的速度是极其缓慢的,那我们是否 ...

最新文章

  1. android中实现view的更新有两组方法
  2. pycharm goland clion 常用快捷键 使用技巧
  3. LA3177长城守卫
  4. 浅谈 Python 程序和 C 程序的整合
  5. c语言标识符的规范,初识C语言-声明和使用变量、标识符的命名规范以及基本数据类型...
  6. 这里90%的程序员根本就不算程序员。
  7. matlab图像拼接_FPGA大赛【四】具体模块设计图像缓存
  8. 数据可视化的十大优点
  9. 按照ISO26262标准检验建模规范:基于模型的软件开发质量工具
  10. 张宇1000题高等数学 第四章 一元函数微分学的计算
  11. 啊哈C语言 第二章 【代码】【习题答案】
  12. Python题库——答案
  13. win10子系统安装php,win10 ubuntu 子系统安装php
  14. lan口配置 petalinux_【Xilinx-Petalinux学习】-02-建立PetaLinux工程
  15. 电路中的输入输出阻抗以及阻抗匹配
  16. 亚马逊账号关联怎么办?多账号如何自查?
  17. docker删除镜像及容器
  18. r语言 C4.5 剪枝是用什么算法_推荐收藏 | 决策树,逻辑回归,PCA算法面经
  19. mysql的日志文件
  20. 毕业设计效果展示:改良的CP-VTON(ICP-VTON)模型

热门文章

  1. FFT [TPLY]
  2. ASP.NET MVC Display Mode 移动端视图 配置对微信内置浏览器的识别
  3. MySQL语法大全_自己整理的学习笔记
  4. C# 多态(接口、虚方法、抽象类)的理解
  5. 微信小程序的多选改变样式_微信小程序button选中改样式-实现单选/多选
  6. androidx和android的区别,【译】使用AndroidX代替Android支持库
  7. java客户服务器程序预约口罩_团队作业(二):Github实训:口罩预约
  8. python print 换行_Python小课堂第21课:规整一下我们的输出之打印格式化与字符串...
  9. 基于单片机的倒车雷达系统设计c语言,基于AT89C2051单片机实现超声波倒车雷达系统的设计...
  10. ‘fopen‘: this function or variable may be unsafe.