使用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]
)