我們的數據倉庫使用來自數據源的累積數據(並且無法反轉累積)來創建雪花模式。我們必須解決的一個要求是我們的模式必須可用於根據日期範圍創建報告。數據倉庫:處理累積數據
我們的模式看起來像這樣(簡化):
+------------------------------------------+
| fact |
+-------+-----------------+----------------+
| id | statisticsDimId | dateRangeDimId |
+-------+-----------------+----------------+
| 1 | 1 | 10 |
| 2 | 2 | 11 |
| 3 | 3 | 12 |
| 4 | 4 | 13 |
| 5 | 5 | 14 |
| 6 | 5 | 15 |
| 7 | 5 | 16 |
| ... | ... | ... |
| 10001 | 9908 | 11 |
| 10002 | 9909 | 11 |
+-------+-----------------+----------------+
+-------------------------------------------------+
| date_range_dimension |
+-------+-----------------------------------------+
| id | startDateTime | endDateTime |
+-------+--------------------+--------------------+
| 10 | '2012-01-01 00:00' | '2012-01-01 23:59' |
| 11 | '2012-01-01 00:00' | '2012-01-02 23:59' |
| 12 | '2012-01-01 00:00' | '2012-01-03 23:59' |
| 13 | '2012-01-01 00:00' | '2012-01-04 23:59' |
| 14 | '2012-01-01 00:00' | '2012-01-05 23:59' |
| 15 | '2012-01-01 00:00' | '2012-01-06 23:59' |
| 16 | '2012-01-01 00:00' | '2012-01-07 23:59' |
| 17 | '2012-01-01 00:00' | '2012-01-08 23:59' |
| 18 | '2012-01-01 00:00' | '2012-01-09 23:59' |
| ... | ... | ... |
+-------+--------------------+--------------------+
+-----------------------------------------------------+
| statistics_dimension |
+-------+-------------------+-------------------+-----+
| id | accumulatedValue1 | accumulatedValue2 | ... |
+-------+-------------------+-------------------+-----+
| 1 | [not relevant] | [not relevant] | ... |
| 2 | [not relevant] | [not relevant] | ... |
| 3 | [not relevant] | [not relevant] | ... |
| 4 | [not relevant] | [not relevant] | ... |
| 5 | [not relevant] | [not relevant] | ... |
| 6 | [not relevant] | [not relevant] | ... |
| 7 | [not relevant] | [not relevant] | ... |
| ... | [not relevant] | [not relevant] | ... |
| ... | [not relevant] | [not relevant] | ... |
| 10001 | [not relevant] | [not relevant] | ... |
| 10002 | [not relevant] | [not relevant] | ... |
+-------+-------------------+-------------------+-----+
我們要創建我們的報表數據與這樣的設置:
SELECT *
FROM fact
INNER JOIN statistics_dimension
ON (fact.statisticsDimId = statistics_dimension.id)
INNER JOIN date_range_dimension
ON (fact.dateDimId = date_range_dimension.id)
WHERE
date_range_dimension.startDateTime = [start]
AND
date_range_dimension.endDateTime = [end]
的問題是,在我們的統計維度數據已經積累了,我們不能反轉積累。我們計算了事實表中近似的行數,得到了5,250,137,022,180。我們的數據大約有250萬個日期範圍排列,我們需要將它們計算到我們的日期維度和事實表中,因爲這些累積。 SQL的SUM函數由於累積而不適用於我們(不能添加屬於非不同集的兩個值)。
是否有最佳做法,我們可以按照使其計算可行?我們的模式設計有什麼問題嗎?
我們需要報告有關在線培訓的數據。數據源是一個遺留數據提供程序,其部件超過10年 - 因此沒有人可以重構內部邏輯。統計維度包含 - 例如 - 用戶在基於網絡的培訓(WBT)中完成的進度(以%計),每個WBT頁面的呼叫數量,WBT的狀態(對於用戶,例如「已完成」) ,aso。關於數據提供者的重要事情是:它只是給我們一個當前狀態的快照。我們無法訪問歷史數據。
您可以在數據背後添加一些業務細節嗎?你試圖回答什麼問題(用商業術語而不是SQL)。我認爲這對於更好地瞭解你的情況會很有幫助。 –
我已經添加了關於上下文的信息。 –
在一個典型的事實表中,這些度量值實際上是在表格上,而不是在另一個維度上。這會大大減慢你的速度。 –