在星型模式中对数据建模的正确方法是什么,以便BI工具(如PowerBI)可以选择跨越多天的日期范围?
我目前拥有的事实表具有不同的日期和时间维度。我的时间分辨率是第二个,日期分辨率是当天。
目前很容易进行聚合,只要感兴趣的数据是在同一天,甚至是整整几天,但当你要求提供时,它会变得更加复杂。跨越午夜边界的12小时滚动窗口。
是的,我可以编写一个SQL语句来首先拉出所有相关日期的所有行,然后将实际日期时间作为一个字段存储在事实表中我可以进一步过滤到实际时间我感兴趣的范围,但在BI报告工具中这不是微不足道的(或在某些情况下可能)。
然而,这必须是数据仓库中的常见情况......那么应该如何做呢?
一个例子是2017 / Jan / 02 1600和2017 / Jan / 03 0400之间的fact_orders表中的订购商品数量。
订单分别存储在fact_orders表中。
在我的实际场景中,我使用的是Azure SQL数据库,但它更像是一般设计问题。
谢谢。
答案 0 :(得分:1)
这不容易建模。解决方案是使用日期+时间构建额外的维度。当然,这可能意味着您必须严格限制时间维度的粒度。
10小时粒度:365 * 10 * 24 = 87600行
10年分钟粒度:365 * 10 * 24 * 60 = 5256000行
您可以只使用此维度,或者(更好)添加它,不要向所有用户显示。这意味着事实表中的另一个关键:如果FT不是巨大的,那就没什么大不了的了。
答案 1 :(得分:1)
我的第一个选择是(在问题中提到)在SQL查询中包含计算列(日期+时间),然后过滤BI工具中的时间部分。
如果这不起作用,您可以在数据库中创建一个视图以达到相同的效果。最简单的方法是采用您希望在BI工具中使用的完整连接事实+维度SQL查询,并在视图中添加日期时间列。
确保仍然在Date字段本身上过滤以允许索引使用!因此,对于您的滑动窗口,您的参数将类似于
WHERE Date between 2017/Jan/02 AND 2017/Jan/03
AND DateTime between 2017/Jan/02 1600 and 2017/Jan/03 0400
如果由于数据量而不能很好地执行,您可能需要设置和维护一个单独的表或物化视图(取决于您的DB和ETL选项),它们执行时间维度的笛卡尔连接如果日期维度的范围很小(只有上周或您对部分日报告感兴趣的任何时期),请将事实表加入到该维度中。
DateTimeWindow表/视图将在DateTime列上编制索引,并且只有两个额外的列:DateKey和TimeKey。使用两个键将事实表连接到事实表,并且当BI工具提供日期时间范围时,您应该获得所需的窗口。