如何在缓慢变化的维度和事实中跟踪合并

时间:2018-03-13 18:14:19

标签: sql data-warehouse scd datamart scd2

在数据集市中,2或3个或更多维度合并形成新维度。如何管理scd以跟踪历史上的所有合并并呈现与这些维度相关的趋势事实?

一个具体示例是三个商店(商业ID 8897,8965,9135)合并以创建新商店商业ID 9700.如何从事实表中提取历史销售数据以显示直到给定日期8897, 8965和9135是独立的商店,现在都是新店9700.

此外,如果新商店的商业号码不是9700,而新商店占据了之前商店的商业ID之一。因此,新的合并商店业务ID不是9700而是8897。

SurrogateKey -------- StoreBusinessID ---------- StoreName
 =============== =================== ================ ==

          1                8897   Alpha Electronic  
          2                8965   Beta Electronics  
          3                9135   Gamma Electronic  
          4                9700   Mega Electornics  

=============== =================== ============= =====

2 个答案:

答案 0 :(得分:1)

< p>您需要使用“类型6”缓慢变化的维度。从本质上讲,它是Type 2和Type 1变化的组合。 < / p为H. < p>它的工作方式: 要捕获“类型2”更改,您需要为“商店”表中的每条记录设置“开始日期”和“结束日期”。对于当前记录,结束日期通常是一些遥远的未来日期,如2999-12-31。将此类表连接到事实表时,您需要在自然键(StoreBusinessID)上以及开始日期和结束日期之间的事实日期上加入维度和事实。 < / p为H. < p>要捕获“类型1”更改,您必须在“商店”表中添加一个字段以跟踪“最新商家ID”。该字段将包含最新版本的业务密钥。如果没有更改,则商店业务ID和最新业务ID将包含相同的密钥。如果商店合并,记录8897,8965,9135和9700将包含“最新商业ID”9700.< / p> < p>因此,您既可以“及时旅行”(在任何时间段内重现完整的历史记录),也可以按商店的最新版本进行分组。 < / p为H.

答案 1 :(得分:0)

事实表已经保存了与SK 1,2和3(ID 8897,8965和9135)的商店相关的数据,因此您可以保留事实表,并且您将始终拥有过去的数据这些商店的表现,直到它们停产的日期。

当新商店(ID 9700)出现时,您可以将其添加为商店维度中的新行(SK 4),将其设置为活动行并设置"已停用"将行存储为非活动状态(您可以使用布尔列,例如" isActive"或"版本")。从这个时间点开始,加载到事实表中的所有数据都将指向带有SK 4(ID 9700)的商店。

在此之前,它只有SK 1,2和3的数据(ID 8897,8965和9135)。因此,当您将其与事实表(使用SK)连接时,您将始终能够使用Store维度中的isActive字段查看过去商店和/或现有商店中的数据。

这称为Slowly Changing Dimension Type 2

  

此方法通过使用单独的代理键和/或不同的版本号为维表中的给定自然键创建多个记录来跟踪历史数据。每个插入都保留无限的历史记录。

编辑关于问题的第二部分," 所需的灵活性是我可以通过合并SK 1,2和之前将其拉到历史9700之前的9700 3 "

一个简单的选择是将层次结构(父商店 - >商店)引入商店维度,并且对于每个其他商店,设置"父商店ID"这样,您可以通过使用其ID来探索专门针对每个过去商店的销售数据,或者仅浏览父商店的数据(父ID = 9700),这将提供所有数据的汇总视图。父母9700下的商店。

这样做的另一个好处是可以使Store维度中的数据准确地描述发生了什么:存储被合并到一个实体中,并且没有任何历史数据丢失(如果我们覆盖其ID,则可能会发生这种情况)。