渐变维度入门.
有一张内容提供商表. 如图, 需要做维度渐变. 渐变列这里做了简化, 只有Cpname.
维度表如下
多了三列, 维度开始时间, 结束时间, 以及是否是当前值.
渐变的设置如下.
在这里我们强调一下图2的几列意思. 固定的属性, 用的比较少, 不做解释. 变化的属性就是, 假设有某行记录该列发生了改变, 那么就执行一条sql语句
update table set 变化的属性=new Value where 业务键 更改该行.
而与此同时, 渐变维度工具栏会为这行数据做一个历史记录, 于是, 执行另一条sql语句.
update table set 新旧标示列=旧 where 业务键
在这里, 我们希望能保留变化的属性的历史值, 因此没有打上勾勾. 我们的标示该行记录的是否最新通过DimEndTIme和IsCurrent来标识.
现在我们在OdsCP表中插入如下一条记录.
declare @dt datetime = dateadd(day,-1, getdate())
insert into OdsCP select NEWID(),'中国联通',@dt,@dt,@dt
运行我们的ssis包, 发现DimCP表同步过来了OdsCp表的最新记录
DimStartTime是刚刚插入的时间. 而业务增加时间故意写成了昨天, 因为ssis包是取的昨天的数据.
OK. 我们来看看修改这条记录看看
update OdsCP set CPName='中国联通垃圾' , UpdateTime=dateadd(day,-1, getdate())
where CPID='0A7AB0A1-9CAA-4E11-9931-D0DA0CAB77FB'
运行Dim包.
我们看到. Cpname果然被修改了. 但是我们期待的历史记录却没有产生. 这是为什么呢?
原来是, 我们在上面只更新了Cpname, CPname是 变化的类型. 而没有历史属性的更改. 因此, 维度渐变就只简单的做了一下update. 执行图如下
OK. 我们重新执行一次
update OdsCP set CPName='中国联通不垃圾' , UpdateTime=dateadd(day,-1, getdate())
,CreationTime=dateadd(day,-1, getdate())
where CPID='A3876677-CA0A-427A-B7B4-9BD99103B1AB'
注意观察. CpName, 和CreationTime都改了. 这次, 变化的属性和需要保存历史的属性都有了. 按照逻辑, 会走上图的右边, 先用Oledb命令更改每一列的的历史属性, 然后union All, 再然后插入数据库.
得到一条心的记录. 这样. 历史数据保留了下来. 这就是渐变维度的处理全过程