Oracle BIEE 中的時間維與時間軸函數,同期,同比,環比,累計,同期累計計算


Oracle BIEE 中的時間維與時間軸函數

    累計、同比、環比是 BI 項目中常用的分析方法。本文講述如何利用 Oracle BIEE 的時間維(Time Dimension)及時間軸函數(Time Series Conversion Function)實現累計、同比、環比計算。本文使用的示例數據可以通過此鏈接下載:http://www.zw1840.com/。 如果你不瞭解如何創建 Oracle BIEE 資料庫,請參考之前的文章 Hello BIEE

目錄

時間軸函數概述

    累計、同比、環比是 BI 項目中常用的分析方法。如果採用關係型數據庫,直接通過 SQL 語句進行這樣的計算是比較麻煩的。Oracle BIEE 提供的解決方法是時間軸函數。時間軸函數是位於邏輯模型層內的函數,使用時間軸函數能夠定義出“去年同期值”或“本年累計值”之類的與時間相關的計算字段。Oracle BIEE 現在支持兩個時間軸函數:
  • Ago:從當前時間起回溯用戶指定的 n 個時間段,返回當時的度量值。
  • ToDate:從用戶指定時間段的起點開始,到當前時間爲止,計算度量值的累計值。
    使用時間軸函數的前提條件是在邏輯模型內定義了時間維。上面兩個函數說明中的“時間段”實際上指的是時間維的層級(Level)。例如使用 Ago 函數定義“去年同期值”,指定的時間段爲“年”這一層級,指定的回溯週期爲 1,表示得到去年的值。再比如使用 ToDate 函數定義“本年累計值”,指定的時間段也是“年”這一層級,表示從年的起點(年初)開始到當前時間爲止,求度量值的累計值。

創建時間維的準備工作

    時間維的創建過程與創建普通維度基本相同,只是維度對象的某些設置不同。因此創建物理模型、邏輯模型、及展現模型的過程在此不細說了,如果你不瞭解請參考之前的文章 Hello BIEE
    在物理模型層,導入時間維表 V_COMMON_DATE;將 V_COMMON_DATE.DAY_ID 定義爲 V_COMMON_DATE 的主鍵;將 V_COMMON_DATE.DAY_ID 定義爲 V_FINANCE_EXPENSE.CONSUME_DATE 的外鍵。


 


 


 


 

    在邏輯模型層,將物理表“V_COMMON_DATE”拖放到邏輯模型“Finance”內;使用“Rename Wizard”重命名;將邏輯字段“Day Id”定義爲邏輯表“Date Dim”的邏輯主鍵;在邏輯表“Date Dim”和“Expense Fact”之間創建邏輯連接。


 


 


 

    在展現模型層,將邏輯表“Date Dim”拖放到展現模型“消費分析”內;只保留年、月、日的名稱字段,並重命名。


 

    需要注意的是,Oracle BIEE 對與時間維相關的物理表及邏輯表有以下要求[6]
  • 如果某個物理表的字段被映射到了時間邏輯表上,那麼這個物理表中的字段不能再映射到其他邏輯表中。
  • 作爲時間邏輯表的數據源的物理表,只允許與物理事實表關聯。且關聯只能基於外鍵(foreign key),而不能基於複雜連接(complex join)。

 

創建時間維

    與創建普通維度對象一樣,以邏輯表“Date Dim”爲基礎創建維度對象“Date”;依次定義層級:“Total Level”、“Year Level”、“Month Level”、“Day Level”,並設定層級的元素數;將邏輯表“Date Dim”的各列拖放當相應的層級;定義各層級的層鍵,並設定主層鍵,以及用於下鑽的層鍵。


 

層級
Level
元素數
Number of elements
層鍵
Key
主層鍵
Primary
用於下鑽
Use for drilldown)
Total Level 1 N/A N/A N/A
Year Level 3 Year Id Yes No
Year Name No Yes
Month Level 36 Month Id Yes No
Month Name No Yes
Day Level 1000 Day Id Yes No
Day Name No Yes

    時間維與普通維度有兩處不同。首先,雙擊維度“Date”節點,在“Dimension”對話框中需要選中“Time Dimension”選項,以表明此維度對象爲時間維度。


 

    其次,時間維度中需要定義時間序列鍵(Chronological Key)。時間序列鍵的作用是表明時間維中具有一組單調增加的時間序列值[1]。定義時間序列 時存在以下原則:
  • 時間維中,至少一個層級上應定義有時間序列鍵[2]
  • 物理存儲的最細時間粒度上必須定義時間序列鍵[3]。在例子中,物理表“V_FINANCE_EXPENSEE”的日期字段“CONSUME_DATE”爲日期,即 物理存儲的最細時間粒度爲日期,因此時間維“Date”的“Day Level”上應該定義時間序列鍵。
  • 除了必要的時間序列鍵,時間維的各個層級上均可建立額外的時間序列鍵,這主要是爲提高查詢性能服務[4]
  • 時間維的同一層級上可以建立多個時間序列鍵,但只有第一個時間序列鍵有效。[5]
    在這個簡單的例子中,我只把層級“Day Level”的邏輯層鍵“Day Id”定義爲時間序列鍵。


 

使用時間軸函數定義度量值

    定義好時間維後,就可以在邏輯事實表中定義使用時間軸函數的邏輯列了。在邏輯表“Expense Fact”上單擊右鍵,選擇“New Object\Logical Column”創建邏輯列。在“Logical Column”對話框中選擇“Use existing logical columns as source”再按右側的按鈕,可以打開“Expression Builder”編輯邏輯列的公式。最後不要忘記將邏輯列添加到展現模型中。
    例如,使用 Ago 函數定義“去年同期值”。
 
AGO(Finance."Expense Fact".Amount, Finance."Date"."Year Level", 1)  

    第一個參數是邏輯字段 Finance."Expense Fact".Amount,是用於時間軸運算的度量值;第二個參數是邏輯模型時間維的層級 Finance."Date"."Year Level",表明回溯的時間單位爲年;第三個參數表示回溯的時間週期,1 則爲回溯一年,即去年。
 


 

    再例如,使用 ToDate 函數定義“本年累計值”。
 
TODATE(Finance."Expense Fact".Amount, Finance."Date"."Year Level")  

    第一個參數是邏輯字段 Finance."Expense Fact".Amount,是用於時間軸運算的度量值;第二個參數是邏輯模型時間維的層級 Finance."Date"."Year Level",表明累計計算開始自年時間的起點,終止到當前時間。
 


 

    在進行時間查詢時應注意幾個重要的粒度[7],以查詢 select "Date Dim"."Month Name", "Expense Fact"."Amount Year Ago" 爲例:
  • "Date Dim"."Month Name" 爲查詢粒度
  • "Expense Fact"."Amount Year Ago" 邏輯列對應的時間維層級爲時間序列粒度
  • 在包含時間序列函數的查詢中,時間序列粒度必須大於等於查詢粒度。
  • "Expense Fact"."Amount Year Ago" 邏輯列對應的物理表的時間粒度被稱爲存儲粒度
  • 與存儲粒度對應的時間維層級上必須定義時間序列鍵。
    Ago 與 ToDate 函數可以嵌套調用,但需要遵守一定規則[8]
    在使用時間序列函數時也有一定限制,具體請參考 BIEE 文檔[9]

查詢

    定義如下查詢,其中“消費金額(同期)”與“消費金額(年累計)”分別爲使用 Ago 和 ToDate 函數創建的邏輯列:


 

    結果如下圖所示:


 

zw1840 at hotmail dot com  轉載請註明出處,謝謝!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章