由于我对模型子句的理解有限,我预计以下三个查询会返回相同的结果,因为数据中没有空值,并且函数是等效的:
select *
from (select level k, 100 v from dual connect by level<=2)
model return updated rows
dimension by (k)
measures (v, 0 shr)
rules ( shr[any] = v[cv()]/sum(v)[any] ); --plain sum
/*
K V SHR
---------- ---------- ----------
1 100 0.5
2 100 0.5
*/
select *
from (select level k, 100 v from dual connect by level<=2)
model return updated rows
dimension by (k)
measures (v, 0 shr)
rules ( shr[any] = v[cv()]/nullif(sum(v)[any],0) ); --with nullif
/*
K V SHR
---------- ---------- ----------
1 100 0.25 <------\___ why?
2 100 0.25 <------/
*/
select *
from (select level k, 100 v from dual connect by level<=2)
model return updated rows
dimension by (k)
measures (v, 0 shr)
rules ( shr[any] = v[cv()]/decode(sum(v)[any],0,null,sum(v)[any]) ); -- with decode
/*
K V SHR
---------- ---------- ----------
1 100 0.5
2 100 0.5
*/
关于解释此行为的规则处理,我缺少什么?
SQLFiddle在这里
在Oracle Database SQL Language Reference中可以阅读
但是 Linux 上的 Oracle 11.2.0.3 给出了以下内容
因此这是(至少是一个文档 :-) 11r2 中的错误
在Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production中得到相同的结果