2012-09-12 61 views
1

我有一個簡單的查詢:Oracle SQL - 我可以給查詢添加時間戳嗎?

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' 

這在當前時刻吐出來的人目前有多少在特定的試驗組的時間。

如果我想看看這個數字是什麼,比如說,在9/10/12,而不是我可以添加一些東西到查詢中以便數據庫在2天前擁有它的時間階段這個信息?

+0

您是否在player_source的歷史記錄表中保留以前的更新?其他選項,但更多涉及(DW) – tbone

回答

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)) 。

維基百科在人們用來解決這類問題的各種模式設計上有一篇很好的文章:請參閱http://en.wikipedia.org/wiki/Slowly_changing_dimension

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' 

這就要求,不過,你有必要做一個閃回查詢和特權Oracle有足夠的空間來申請這些表,以便能夠恢復到兩天前午夜時分那些表的狀態。數據庫不太可能被配置爲保留那麼多,雖然它通常是可能的。如果您碰巧正在使用Oracle Total Recall,此查詢也可以正常工作。

但是,更可能需要修改模式定義,以便存儲歷史信息,然後您可以查詢該時間點。有很多種方法可以實現這一點 - 在@ruakh提出的更有效的選項之一中添加有效和到期日期列。哪些選項適合您的特定情況取決於多種因素,包括您希望保留多少歷史記錄,數據更改頻率等。