我是一名ETL开发人员,目前正在负责从关系数据库中的现有历史数据开发a type 2 SCD。我完全有能力创建一个2型SCD,它负责跟踪数据的未来变化,但是当涉及到手头的任务时,我完全没用。
关系模型在我们的ODS中。基于该关系模型,我应该在DW维度中构建平面记录。需要监视多个属性以进行更改,每个属性都在关系模型中的特定相关表中。必须每天保留历史更改,如果同一属性的多个更改在同一天发生,则只有最后一个存在。
我该如何解决这个问题?我迷路了。提前谢谢。
P.S。我们正在讨论具有20-30万行和多个属性的表,这些表可能在任何给定时间发生变化,因此必须在SCD中产生新记录。
答案 0 :(得分:1)
这确实很痛苦。我假设您的问题是包含属性值的表当前是独立变化的(或者您不需要提问)。
如果您的表'Table1'包含'Key','Attribute1'和'Effective From','Effective To'列,那么您可以将该表“爆炸”为“Key”形式的虚拟表, 'Attribute1','Date',为该属性为最新的每个日期投出一行。
(请注意,你可能不希望这样做作为日期维度的远程联接,因为这将是Triangular Join(即表现非常糟糕),你可能需要在ETL工具中/以编程方式爆炸行
如果您跨多个表执行此过程,您将拥有一组表,为您提供每个属性的完整日常快照,以供您关注的每一天使用。然后根据“FK”和“日期”加入这些表格相当容易,为您提供所有属性值的完整每日快照。
然后,当然,你需要运行这个通过另一个进程来折叠具有相同Key,连续日期和所有相同属性值的行,即'unexplode'行,回到'有效从','有效到'形式。再次注意,这基本上是逐行操作(或者至少是窗口函数),并且基于集合的方法将表现得非常糟糕。就个人而言,我只是通过一些.net / java代码来实现这一点。
鉴于数据量这将需要一段时间,但应该是可以实现的。