oracle:MODEL子句


使用MODEL 子句

MODEL 子句像數組那樣訪問記錄中的某列

eg:查詢員工(e_id)#21完成的產品類型(id)為#1和#2的銷量,並根據2003年銷售預測2004年123月的值

SELECT id,year,month,sales_amount
FROM table_name
WHERE id BETWEEN 1 and 2
AND e_id=21
MODEL
PARTITION BY(id)
DIMENSION BY(month , year)
MEASURES (amount sales_amount) (
sales_amount[1,2004] = sales_amount[1,2003],
sales_amount[2,2004] = sales_amount[2,2003],
sales_amount[3,2004] = ROUND(sales_amount[3,2003]*1.24,2)
)
ORDER BY id, year,month;

其中:
PARTITION BY(id)指定結果是根據id 分區的

DIMENSION BY(month, year)是定義數組的維數。

MEASURES(amount sales_amount)用來指定包含amount的數組中的任何一個單元,數組名為sales_amount。 注意 table_name 中時沒有sales_name的,SELECT 中的sales_name 是通過這里來的。

 

  • 使用BETWEEN AND 返回特定范圍的數據
sales_amount[1,2004] =
ROUND(AVG(sales_amount)[month BETWEEN 1 AND 3,2003],2)

這樣就可以求得 2003 年 1.2.3月的平均值賦給 2004年1月 四舍五入到小數點后兩位

 

  • 使用ANY 和 IS ANY 訪問說有數據單元

ANY匹配的位置標記,IS ANY 匹配的是符號標記,意思是ANY 所在的位置上,對應該列的所有值,IS ANY 要跟列名合在一齊用

sales_amount[1,2004] = 
ROUND(SUM (sales_amount)[ANY, year IS ANY], 2)

ANY 對應的是month,IS ANY 對應的是year ,是要把列名 year 寫出來
這樣的賦值就是全部年份的全部月份的和的平均值

  • 用CURRENTV()獲取某個維度的當前值
sales_amount[1,2004] = 
sales_amount[CURRENTV(),2003]

這樣CURRENTV() 獲得了上面的sales_amount[1,2004] 的 ‘1’

 

  • for循環訪問數據單元

 

sales_amount [FOR month FROM 1 TO 3 INCREMENT 1, 2004] = 
sales_amount[CURRENTV(),2003]

 

  • 處理空值和缺失值

IS PRESENT:

cellZAI MODEL子句執行前存在,(存在的意思是那個單元分配了,但是數據可以為NULL或確實的值)IS PRESENT返回TRUE

sales_amount[1,2004] = 
CASE
WHEN sales_amount[CURRENTV(),2003] IS PRESENT THEN
sales_amount[CURRENTV(),2003]
ELSE
0
END

 

PRESENTV():

如果cell在MODEL子句前已經存在,PRESENTV(cell, expr1, expr2) 返回表達式1,如果不存在返回expr2

sales_amount[1,2004] = 
PRESENTV(sales_amount[CURRENTV(),2003], sales_amount[CURRENTV(),2003] , 0)

 

PRESENTNNV():

如果cell在MODEL執行前已經存在,而且單元值非空,則PRESENTNNV(cell, expr1, expr2) 返回expr1,如果記錄不存在或者單元值為空,返回expr2

 

IGNORE NAV 、KEEP NAV:

IGONRE NAV的返回值:

空置或缺失數字值時返回0

空置或缺失字符串值時返回空字符串  (NULL 和 ‘’ 的區別)

空置或缺失日期值時01-JAN-2000

KEEP NAV 對空值或缺失數字值返回空值

默認條件為 KEEP NAV

MODEL IGNORE NAV

MODEL KEEP NAV


更新已有單元、阻止創建新單元(RULES UPDATE):

默認情況下,表達式左邊單元如果已經存在,則更新其值,不存在則創建一條新記錄

使用RULES UPDATE 可以阻止創建新記錄

MEASURE(month, year)
RULES UPDATE(
sales_amount[FOR month FROM 1 TO 3 INCREMENT 1 ,2004] = sales_amount[CURRENTV(), 2003]
)




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM