1

我有一个简单的查询:

Select         Count(p.Group_ID)
From           Player_Source P 
  Inner Join   Feature_Group_Xref X On P.Group_Id=X.Group_Id 
where          x.feature_name ='Try this site'

它会在当前时刻吐出特定测试组中的当前人数。

如果我想看看这个数字是多少,比如说,在 2012 年 9 月 10 日,我可以在查询中添加一些东西来对这些信息进行时间分段,因为数据库在 2 天前就有了它吗?

4

2 回答 2

3

不可以。如果您想存储历史信息,您需要将其合并到您的架构中。例如,您可以扩展Feature_Group_Xref以添加列Effective_Start_TimestampEffective_End_Timestamp; 要查找当前具有给定特征的组,您可以编写AND Effective_End_Timestamp > CURRENT_TIMESTAMP()(或AND Effective_End_Timestamp IS NULL,取决于您要如何定义列),但要查找哪些组在特定时间具有给定特征,您可以编写AND ... BETWEEN Effective_Start_Timestamp AND Effective_End_Timestamp(或AND Effective_Start_Timestamp < ... AND (Effective_End_Timestamp > ... OR Effective_End_Timestamp IS NULL))。

Wikipedia 上有一篇很好的文章,介绍了人们用来解决此类问题的各种模式设计:请参阅http://en.wikipedia.org/wiki/Slowly_changeing_dimension

于 2012-09-12T19:46:14.897 回答
1

这取决于...

至少理论上可以使用闪回查询

Select Count(p.Group_ID)
  From Player_Source as of timestamp( date '2012-09-10' ) P 
       Join Feature_Group_Xref as of timestamp( date '2012-09-10' ) X 
         On P.Group_Id=X.Group_Id 
 where x.feature_name ='Try this site'

但是,这要求您具有执行闪回查询所需的权限,并且UNDOOracle 有足够的权限申请能够恢复到两天前午夜时这些表所处的状态。尽管通常是可能的,但数据库不太可能配置为保留那么多UNDO。如果您碰巧使用的是Oracle Total Recall ,此查询也可以工作。

但是,更有可能的是,您需要修改架构定义,以便存储历史信息,然后您可以在某个时间点查询这些信息。有多种方法可以实现这一点——正如@ruakh 建议的那样,在表中添加有效日期和到期日期列是更受欢迎的选项之一。哪些选项适合您的特定情况将取决于多种因素,包括您想要保留多少历史记录、数据更改的频率等。

于 2012-09-12T19:53:38.757 回答