Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当SCD2感知表上发生SCD1更改时,应该更新什么_Sql_Sql Server_Data Warehouse_Olap_Kimball - Fatal编程技术网

Sql 当SCD2感知表上发生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…给出相同的结果 考虑到这一点,有两种特殊情况:如果记录没有当前版本,如果最

我不确定Kimball数据仓库文献中是否回答了这个问题-我找不到答案

假设您有一个表,其中包含两个支持SCD2的列和一些SCD1列。问题很简单:当SCD1列发生更改时,哪些记录会被更新

您是否更改了所有记录,当前记录和所有历史记录?还是只更改最近(打开)的记录?我倾向于使用“全部”,而我所有的同事都坚持使用“仅限最近的”

我能给出我的意见的唯一原因是,当我在业务键列或SCD1列上运行时,我希望
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