我有兩個表的時間維度查詢數據倉庫中的數據包括時間維度
日期(唯一行的每一天)(一天唯一的行爲每分鐘)
時間一天
根據這種模式,如果想要檢索最後X小時的事實,那麼X可以是大於0的任何數字,那麼查詢將會是什麼樣子。
當開始時間和結束時間碰巧在開始時變得棘手一年中兩個不同的日子。
編輯:我的事實表沒有時間戳列
我有兩個表的時間維度查詢數據倉庫中的數據包括時間維度
日期(唯一行的每一天)(一天唯一的行爲每分鐘)
時間一天
根據這種模式,如果想要檢索最後X小時的事實,那麼X可以是大於0的任何數字,那麼查詢將會是什麼樣子。
當開始時間和結束時間碰巧在開始時變得棘手一年中兩個不同的日子。
編輯:我的事實表沒有時間戳列
事實表確實有(應該有)原時間戳,爲了避免發生日的邊界上怪異的時間查詢。奇怪的意思是在WHERE子句中有一些複雜的日期時間函數。
在大多數DW中,這些類型的查詢非常罕見,但您似乎將數據流式傳輸到DW中並同時用於報告。
所以我建議:
介紹在事實表中的全部時間戳。
對於舊記錄,請使用日期和時間鍵重新創建時間戳記。
DW查詢都是關於沒有任何功能在WHERE子句中,或者如果一個功能已被使用,確保它是SARGABLE。
將Start Date
和End Date
列轉換爲TIMESTAMP
並填充它們可能會更好。
切片表需要採取適當的interval BETWEEN Start Date AND End Date
。在Oracle中interval
將沿着SYSDATE - (4/24)
或SYSDATE - NUMTODSINTERVAL(4, 'HOUR')
此線的東西也被改寫爲:
Start Date <= (SYSDATE - (4/24)) AND End Date >= (SYSDATE - (4/24))
在我看來,鑑於你目前的模式,你將需要檢索時間維度表中符合您的搜索條件的適當時間ID,然後在事實表中搜索匹配的行。根據您的時間維度的粒度,你可能想看看這樣做是(SQL Server的實例)的性能:
子查詢:
SELECT X FROM foo其中TIMEID IN(SELECT ID FROM DIMTIME WHERE HOUR> = DATEPART(HOUR,CURRENT_TIMESTAMP())AND DATEID IN(SELECT ID FROM DIMDATE WHERE DATE = GETDATE())
內部聯接:
SELECT X FROM 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」分析的立方體?
如果這不是一個「彙總」立方體,我會同意其他海報,因爲您應該使用更好的按鍵重新標記您的事實數據表,並且如果您實際上打算頻繁搜索小時,那麼您應該將其也包含在事實表中,因爲任何其他嘗試都可能會使查詢變得不可靠(請參閱What makes a SQL statement sargable?)。
Microsoft建議在http://msdn.microsoft.com/en-us/library/aa902672%28v=sql.80%29.aspx說:「智能」
與在其他維度表,日期和時間維度鍵使用應該是代理鍵日期維度的建議鍵爲「yyyymmdd」形式。這種格式對於用戶來說很容易記住並且被整合到查詢中。它也是推薦的按日期劃分爲多個表的事實表的替代鍵格式。
祝你好運!
你使用的是什麼rdbms? –
你可能會創建一個時間列(使用視圖,或「與」,或只是一個子查詢加入),然後使用它。但時間命令變化很大,以至於知道你使用的db是至關重要的。 –
現在正在使用mysql,但我將不得不在不久的將來使它至少與sqlserver,oracle和sqllite一起工作 – WPFAbsoluteNewBie