Sql 当SCD2感知表上发生SCD1更改时,应该更新什么
我不确定Kimball数据仓库文献中是否回答了这个问题-我找不到答案 假设您有一个表,其中包含两个支持SCD2的列和一些SCD1列。问题很简单:当SCD1列发生更改时,哪些记录会被更新 您是否更改了所有记录,当前记录和所有历史记录?还是只更改最近(打开)的记录?我倾向于使用“全部”,而我所有的同事都坚持使用“仅限最近的” 我能给出我的意见的唯一原因是,当我在业务键列或SCD1列上运行时,我希望Sql 当SCD2感知表上发生SCD1更改时,应该更新什么,sql,sql-server,data-warehouse,olap,kimball,Sql,Sql Server,Data Warehouse,Olap,Kimball,我不确定Kimball数据仓库文献中是否回答了这个问题-我找不到答案 假设您有一个表,其中包含两个支持SCD2的列和一些SCD1列。问题很简单:当SCD1列发生更改时,哪些记录会被更新 您是否更改了所有记录,当前记录和所有历史记录?还是只更改最近(打开)的记录?我倾向于使用“全部”,而我所有的同事都坚持使用“仅限最近的” 我能给出我的意见的唯一原因是,当我在业务键列或SCD1列上运行时,我希望COUNT(DISTINCT…给出相同的结果 考虑到这一点,有两种特殊情况:如果记录没有当前版本,如果最
COUNT(DISTINCT…
给出相同的结果
考虑到这一点,有两种特殊情况:如果记录没有当前版本,如果最近的版本超出范围,并且没有新实例,该怎么办?如果我使用SCD2逻辑来准备将来自动激活的记录会怎么样
如果我只更新最新的开放版本,那就意味着在第一种特殊情况下我不会更改任何内容,而在另一种情况下,我需要更改所有未来(准备好的)记录。想想看。。。我相信“全部”是正确的答案
有人能指出一个著名的白皮书网站(如微软的Kimball)给出答案吗?All。类型1的目的是将事实与属性的当前值相关联: 在类型2中,SCD事实与事实发生时处于活动状态的维度的“版本”相关联。为了使与版本关联的事实“与属性的当前值关联”,必须在维度的所有版本上更新当前值 例如,如果你有
SalesFact(Date,CustomerId,Amount)
及
如果要将历史销售事实与客户的当前销售人员相关联,而不是与销售时活跃的销售人员相关联,则必须为该客户的所有版本更新CustomerDim。乙二醇
update CustomerDim set SalesPersonId = 1234 where CustomerBk = 'Acme'
或者像这样的查询
select sum(Amount)
from SalesFact s
join CustomerDim c
on s.CustomerId = c.CustomerId
where c.SalesPersonId = 1234
不会返回该销售人员客户的旧销售额。根据定义,当SCD1属性更改时,必须更新所有行。如果只更改最新版本,则为SCD2更新
如果您有大量的版本行,您可以考虑将SCD1和SCD2维度拆分为单独的表。这确实会从事实(类型4)中添加一个额外的引用,或者需要将新的SCD2维度降雪到新的SCD1维度。这两个选项都解决了混合维度更新的问题。
这种方法称为缓慢更改维度,而不是缓慢更改属性。忽略更高级别的复杂性,维度可以是SCD0、1或2-因此,如果SCD2维度中的任何属性发生更改,则您将创建一个新记录 试图使维度中的属性具有不同的SCD级别只会让您陷入所描述的混乱select sum(Amount)
from SalesFact s
join CustomerDim c
on s.CustomerId = c.CustomerId
where c.SalesPersonId = 1234