从具有单独日期和时间维度的星型模式中选择跨日期边界的数据

Selecting data across day boundaries from Star schema with separate date and time dimensions

在星型模式中对数据进行建模的正确方法是什么,以便 BI 工具(例如 PowerBI)可以 select 跨越多天的日期范围?

我目前有事实 table 具有单独的日期和时间维度。我的时间分辨率是秒,日期分辨率是一天。

如果感兴趣的数据是在同一天,甚至是多个完整的日期,目前聚合非常容易,但是当你要求,比如说,12 小时的滚动时,它会变得复杂得多window 跨越午夜边界。

是的,我可以写一个 SQL 语句,首先提取所有相关日期的所有行,然后将实际日期时间存储为事实中的一个字段 table 我可以进一步过滤到我感兴趣的实际时间范围,但这在 BI 报告工具中并非微不足道(或在某些情况下可能)。

然而这在数据仓库中一定是经常出现的场景...那么应该怎么做呢?

一个例子是给我 2017/Jan/02 1600 和 2017/Jan/03 0400 之间 fact_orders table 的订购商品数量。

订单单独存储在 fact_orders table。

在我的实际场景中,我使用的是 Azure SQL 数据库,但这更像是一个一般的设计问题。

谢谢。

这不容易建模。一种解决方案是使用日期 + 时间构建一个附加维度。当然,这可能意味着您必须严格限制时间维度的粒度。

10 年小时粒度:365 * 10 * 24 = 87600 行

10 年分钟粒度:365 * 10 * 24 * 60 = 5256000 行

您可以只使用这个维度,或者(更好)添加它而不向所有用户显示它。这将意味着事实中的一个额外关键table:如果英国《金融时报》不是巨大的,没什么大不了的。

我的第一个选择是(正如您在问题中提到的那样)在 SQL 查询中包含一个计算列(日期 + 时间),然后在 BI 工具中过滤时间部分。

如果还是不行,你可以在数据库中创建一个视图来达到同样的效果。最简单的方法是采用您想在 BI 工具中使用的完整联合事实 + 维度 SQL 查询,然后在视图中添加 date-time 列。

确保仍然对日期字段本身进行过滤以允许使用索引!所以对于你的滑动window,你的参数应该是

WHERE Date between 2017/Jan/02 AND 2017/Jan/03 AND DateTime between 2017/Jan/02 1600 and 2017/Jan/03 0400

如果由于数据量的原因,它的性能不够好,您可能需要设置和维护一个单独的 table 或执行笛卡尔连接的物化视图(取决于您的数据库和 ETL 选项)时间维度与日期维度的小范围(仅上周或您对部分日报告感兴趣的任何时间段)的一部分,然后将事实 table 加入其中。

DateTimeWindow table/view 将在 DateTime 列上建立索引,并且只有两个额外的列:DateKey 和 TimeKey。使用两个键将其与事实 table 结合起来,当 BI 工具提供日期时间范围时,您应该得到您想要的 window。