作者:三千仇人-奈我何 | 来源:互联网 | 2014-07-13 17:52
oracle中MODEL子句的再探model的语法如下:MODEL[<globalreferenceoptions>][<referencemodels>][MAIN<main-name>][PARTITIONBY(<cols>)]DIMENSIONBY(<cols
oracle中MODEL子句的再探
model的语法如下:
MODEL
[]
[]
[MAIN ]
[PARTITION BY ()]
DIMENSION BY ()
MEASURES ()
[]
[RULES]
(, ,.., )
www.2cto.com
::=
::= RETURN {ALL|UPDATED} ROWS
::=
[IGNORE NAV | [KEEP NAV]
[UNIQUE DIMENSION | UNIQUE SINGLE REFERENCE]
::= www.2cto.com
[UPDATE | UPSERT | UPSERT ALL]
[AUTOMATIC ORDER | SEQUENTIAL ORDER]
[ITERATE () [UNTIL ]]
::= REFERENCE ON ON ()
DIMENSION BY () MEASURES ()
先解释一下关键字:
MODEL 标示字。
RETURN {ALL|UPDATED} ROWS 返回的结果集是否只包含修改或新增的记录,默认是ALL。
MAIN 当有引用MODEL自己时,标示以下条件是主MODEL的条件。
PARTITION BY 按参数中的列分组,之后的运算都是分组进行的;参数可以是表达式,但是必须有别名。
DIMENSION BY 声明各分组中的维度字段,相当于多维键值对的建,字段值即键;参数可以是表达式,但是必须有别名。
MEASURES 声明各分组中的指标字段,即键值对中的值;参数可以是表达式,但是必须有别名。
IGNORE NAV|KEEP NAV 替换null|保留null,0替换数组,空格替换字符,01-JAN-2001 替换日期,null替换其他,默认是KEEP NAV 。
UNIQUE DIMENSION|UNIQUE SINGLE REFERENCE 组内维度唯一|右侧引用唯一,默认是UNIQUE DIMENSION,右侧引用唯一的另一个区别是可能更新多个单元,因为左侧单元可能不唯一。
RULES [UPDATE|UPSERT|UPSERT ALL] 指标计算规则,更新|更新和简单插入|更新和复杂插入,默认是UPSERT 。
AUTOMATIC ORDER|SEQUENTIAL ORDER 指标计算的顺序,逻辑依赖顺序|书写顺序,默认是SEQUENTIAL ORDER 。
ITERALTE(N) [UNTIL(C)] 重复N次的计算,直到满足C的条件退出。
REFERENCE name ON (select子句) 维度、指标定义,内嵌子MODEL,主MODEL中使用name引用。
UPDATE 只更新已有单元,不存在则无效果。
UPSERT 在上面的基础上,如果左侧单元是以位置引用的话,则不存在就插入;FOR也是位置引用,但是更新的单元为FOR列表和其他维度的交叉乘集;左侧单元使用ANY引用,不会产生新单元,ANY的意思是IS NULL OR IS NOT NULL。 www.2cto.com
UPSERT ALL 在上面的基础上,左侧单元可以使用IN,ANY等谓词。
UPSERT的执行过程:
1、找出左侧单元的逻辑引用,谓词也是逻辑引用。
2、计算出逻辑引用的笛卡尔积集合。
3、和位置引用一起得出需要运算的单元集。
4、根据RULE规则更新或新增记录。
指标运算:
可以使用自带的一些函数,当前维度值可以使用CV(),只能用在单元引用,如果是外面则必须加上维度名。
维度为ANY、FOR、BETWEEN等时,可以在单元后面加上ORDER BY 维度名,固定单元计算的顺序。
右侧表达式可以有分析函数,聚合函数等。
作者 hulubo