【问题标题】: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 格式而不是某些代理键方面。 (这是一个实用的规则-理论没有涵盖)