如何在SSAS Cube中为公司维度实现SCD类型2缓慢变化维
SSAS Cube实现公司维度SCD类型2的完整解决方案
第一步:补全DimCompanies维度的SCD2必要字段
你已新增的YearId、IsCurrent可保留,再补充3个核心字段即可跑通完整逻辑:
CompanySK:维度代理键,自增主键,每条维度版本记录的唯一标识(此前方案未跑通大概率是未将该字段关联到事实表)EffectiveStartDate:当前公司名称的生效起始日期,格式和DimDate的日期字段对齐EffectiveEndDate:当前公司名称的生效结束日期,最新版本记录统一填9999-12-31
字段规则说明:
- 2000-2005年使用旧名称的公司记录:
EffectiveStartDate填2000-01-01,EffectiveEndDate填2005-12-31,IsCurrent填0 - 2006年起使用新名称的公司记录:
EffectiveStartDate填2006-01-01,EffectiveEndDate填9999-12-31,IsCurrent填1 - 同一个公司的所有版本记录的
CompanyId(业务键)保持一致 - 如果你仅需要按年份做版本控制,可直接用已有的
YearId做范围匹配,不需要新增上述两个日期字段,逻辑和日期范围匹配完全一致。
第二步:调整FactTable关联逻辑
事实表ETL加载时新增如下处理:
- 通过事实表的
DateId关联DimDate,拿到该条事实对应的发生日期/年份 - 用事实的
CompanyId+ 发生日期/年份,匹配DimCompanies中满足事实日期 BETWEEN EffectiveStartDate AND EffectiveEndDate(或事实年份 BETWEEN 起始YearId AND 结束YearId)的维度记录 - 取匹配到的维度记录的
CompanySK,替换事实表中原有CompanyId字段,最终事实表保留字段为Val、CompanySK、DateId
第三步:SSAS项目配置
数据源视图(DSV)关联配置
建立3张表的关联关系:
DimCompanies.CompanySK1:N 关联FactTable.CompanySKDimDate.DateId1:N 关联FactTable.DateId- DimCompanies和DimDate不需要直接关联,两者通过事实表实现时间维度的切片关联,这就是两个维度的核心关联逻辑。
Cube维度用法配置
在Cube设计页的「维度用法」标签中,确认两个维度和事实表的关联粒度:
- DimCompanies维度关联粒度为
CompanySK - DimDate维度关联粒度为
DateId
不需要额外设置维度之间的直接关系。
第四步:效果验证
部署处理Cube后做两个测试即可确认正确性:
- 筛选2000-2005年的事实数据,展示的公司名称为旧名称
- 筛选2006年及之后的事实数据,展示的公司名称为新名称
- 若需要按公司主体汇总全时间段数据,可将
CompanyId(业务键)设置为DimCompanies的维度属性,按该属性分组即可合并同一公司不同名称版本的数值。
如果你暂时不想修改现有事实表结构,可使用小数据量场景下的简化方案:
- 在DSV中新增命名查询
BridgeCompanyDate,查询逻辑为将DimCompanies和DimDate做笛卡尔积,筛选出DimDate.Date BETWEEN DimCompanies.EffectiveStartDate AND DimCompanies.EffectiveEndDate(或DimDate.YearId BETWEEN DimCompanies.起始YearId AND DimCompanies.结束YearId),输出字段为CompanyId、DateId- 在Cube的维度用法中,设置DimCompanies和事实表的关联为多对多关系,中间桥接表为
BridgeCompanyDate,关联键为CompanyId和DateId即可,不需要修改事实表现有字段。
内容的提问来源于stack exchange,提问作者Mahdi Moghimi
相关产品推荐
相关产品推荐

