【问题标题】:Joining date dimension multiple times? - Kimball's book on Data warehouse and Dimension Modeling多次加入日期维度? - Kimball 关于数据仓库和维度建模的书
【发布时间】:2021-12-04 07:42:43
【问题描述】:

我正在阅读 Ralph Kimball 关于数据仓库和维度建模的书,在第 6 章中,有关于维度角色扮演的这一部分。

有时您会发现与每笔交易相关的其他日期, 例如订单要求的发货日期。每个日期 应该是事实表中的外键... 但是,您不能简单地将这两个外键连接到同一个日期维度表。 SQL 会同时解释这个双向的 加入要求两个日期相同,这不是很好 可能。

我不确定我是否理解最后两句话。如果事实表中的两个日期具有不同的值,这是否意味着您不能多次加入日期维度?为什么?

【问题讨论】:

    标签: database data-warehouse dimension dimensional-modeling kimball


    【解决方案1】:

    表达得不是很好,但它的意思是,如果您要从 Fact 表中的不同 FK 多次加入日期维度,则需要为日期维度设置别名。

    这适用于 2 个表不止一次连接在一起的任何 SQL 语句,它不特定于维度建模。

    【讨论】:

      【解决方案2】:

      这里(很好)隐藏的信息是您需要多个连接 - 每个维度角色一个

      假设您有一个事实表,其中 进入日期 entry_d预订日期 booking_d

      这将是错误,并且是可能在文本中的意思

      select * from fact
      join time_dim tim
      on fact.entry_d = tim.date_d and
         fact.book_d = tim.date_d;
      

      这是正确使用两个独立的时间维度连接

      select * from fact
      join time_dim entr on fact.entry_d = entr.date_d  
      join time_dim book on fact.book_d = book.date_d;
      

      还要注意,如果您使用 inner join,如上例所示,您应该对两个日期进行一些基本的验证和清理。关键是:您应该识别具有无效日期的事实行(未包含在时间维度或NULL 中)并妥善处理它们 - 而不是在连接中默默地丢弃它们

      对于非平凡的设置,尤其是当事实表在时间列上分区时,您选择本机DATE 格式而不是某些代理键方面。 (这是一个实用的规则-理论没有涵盖)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多