2011-11-14 33 views
0

我正在實施一個基本的星型模式來爲我的公司提供購買報告。我們的事實表總結了4個維度,並且彙總了每日,每週,每月和每年的總計。PHP中簡單數據倉庫的日期之間的間隔

該代碼當前知道如何處理單日,數週,數月和數年的報表。下一步是實施任意日期範圍報告。提供一個範圍,目標是瞭解這兩個日期之間的總年數,月份,週數和天數,並拉到合適的記錄來計算總數。問題是我們需要確定兩個日期之間的每個整個粒度週期的計數,而不僅僅是經過的時間量。

例如,在'2009-06-29'和'2011-06-29'之間已經過了2年,但是我們需要知道這個範圍包括一整年(2010),十一個月(Jan- May/10 & Jul-Dec/09)和58天(Jun 1-29/09 & Jun 1-29/11)。

從這個結果中,我們可以從70個粒度週期中提取已經彙總的記錄,合併並呈現總計。

我一直在編寫測試代碼來確定將日期範圍分解爲其組成部分的最佳方式,但是由於我懷疑我正在過度使用此過程,因此我正在退後一步。目前的草案作爲:

  1. 填入「datesToParse」數組與初始日期範圍。
  2. 確定日期之間是否存在一個或多個滿年。
    • 對於日期之間的每一年,從日期範圍中刪除該期間,並將該年份之前的「期間」和「期間之後」分爲兩個新的日期範圍。
    • 在「datesToParse」堆棧上推送兩個新的日期範圍。
    • 重複
  3. 當所有可能的幾年已經從「datesToParse」數組中刪除,重複上述過程數月,周,日。

理論上這應該遞歸地將初始日期範圍縮減爲全年,月,周和天的集合。

有沒有更好的方式來做到這一點?這看起來像是之前已經解決了很多次的問題。

+1

你能不能簡單地選擇那個時期的所有聚合每日總數,並將它們加在SQL中? – liquorvicar

回答

1

我不明白你爲什麼要實現這樣一個複雜的解決方案,通常的實現是隻有一個事實表的數據在最低粒度級別(每天在你的情況下)和簡單的SUM()up根據需要查詢您的查詢中的措施。

這是非常簡單的實施和維護和查詢非常容易編寫(或從您的報告工具生成)。這不適合你嗎?你有多少數據量?你是否將日期作爲維度實現(希望是)或作爲事實表中的值?您是使用報告工具(SSRS,Cognos,Business Objects)還是滾動您自己的查詢?

如果你正在考慮性能問題,這是很普遍的DWH演變是這樣的:

  1. 實現單事實表(如上所述)
  2. 添加大量數據
  3. 發現性能問題,因爲數據量增加
  4. 提高索引
  5. 實現表分區
  6. Impleme nt OLAP

您的解決方案聽起來有點像自制的OLAP實現,但尚不清楚爲什麼需要它。如果你的數據量小到中等,你可能可以很好地管理它索引和分區。如果它很大,那麼您可能會考慮使用OLAP和專門的報告工具,這將是一個更廣泛的問題。但是你沒有提供關於你的環境或要求的很多信息,所以我可能在這裏不受歡迎。