1

我有两个时间维度表

日期(每一天的唯一行) 一天
中的时间(一天中每一分钟的唯一行)

鉴于此模式,如果要检索过去 X 小时的事实,其中 X 可以是大于 0 的任何数字,查询会是什么样子。

当开始时间和结束时间恰好在一年中的两个不同日子时,事情开始变得棘手。

编辑:我的事实表没有时间戳列

4

3 回答 3

2

事实表确实具有(并且应该具有)原始时间戳,以避免在一天的边界上发生奇怪的按时间查询。奇怪意味着在 WHERE 子句中有某种类型的复杂日期时间函数。

在大多数 DW 中,这类查询非常少见,但您似乎将数据流式传输到 DW 并同时使用它进行报告。

所以我建议:

  1. 在事实表中引入完整的时间戳。

  2. 对于旧记录,从日期和时间键重新创建时间戳。

DW 查询都是关于在 WHERE 子句中没有任何函数,或者如果必须使用函数,请确保它是SARGABLE

于 2011-08-17T12:26:44.040 回答
0

Start Date通过将andEnd Date列转换为TIMESTAMP并填充它们,您可能会得到更好的服务。

切表需要采取适当的interval BETWEEN Start Date AND End Date. 在甲骨文中,这interval将是类似于SYSDATE - (4/24)SYSDATE - NUMTODSINTERVAL(4, 'HOUR')

这也可以重写为:

Start Date <= (SYSDATE - (4/24)) AND End Date >= (SYSDATE - (4/24))
于 2011-08-18T19:48:20.540 回答
0

在我看来,鉴于您拥有的当前架构,您将需要从满足您的搜索条件的时间维度表中检索适当的时间 ID,然后在事实表中搜索匹配的行。根据时间维度的粒度,您可能需要检查执行以下任一操作的性能(SQL Server 示例):

  1. 一个子选择

    从 FOO 中选择 X,其中 TIMEID 在(从 DIMTIME 中选择 ID,其中 HOUR >= DATEPART(小时,CURRENT_TIMESTAMP())和 DATEID 在(从 DIMDATE 中选择 ID,其中日期 = GETDATE())

  2. 内部连接

    SELECT X FOO INNER JOIN DIMTIME ON TIMEID = DIMTIME.ID WHERE HOUR >= DATEPART(HOUR, CURRENT_TIMESTAMP()) INNER JOIN DIMDATE ON DATEID = DIMDATE.ID WHERE DATE = GETDATE()

这些都不是真正有吸引力的选择。

您是否考虑过您可能正在查询用于汇总分析而不一定用于“最后 X”分析的多维数据集?

如果这不是“汇总”多维数据集,我会同意其他海报,因为您应该使用更好的键重新标记事实表,如果您确实打算经常搜索下班时间,您可能应该也将其包含在事实表中,因为任何其他尝试都可能使查询不可分割(请参阅什么使 SQL 语句可分割?)。

Microsoft 在http://msdn.microsoft.com/en-us/library/aa902672%28v=sql.80%29.aspx建议:

与其他维度表中使用的代理键相比,日期和时间维度键应该是“智能的”。日期维度的建议键采用“yyyymmdd”形式。这种格式很容易让用户记住并合并到查询中。对于按日期划分为多个表的事实表,它也是推荐的代理键格式。

好运!

于 2012-04-02T10:46:04.053 回答