About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc
全部博文(169)
分类: Oracle
2020-06-28 17:13:03
单元格引用是一个model查询中最基本的需求。你引用一个单元格是通过分区中的维度来标识。引用model中的单元格有两种方式:symbolic cell referencing and positional cell referencing(符号单元格引用和位置单元格引用).
在符号单元格引用中,可以对每个维度指定一个布尔表达式,比如列名(布尔条件比如in ,between,=,>等),注意名字如果有别名,要一致。诸如:
s[y=2001,m=3] //其中s就是度量的值的别名,通过measures确定,y和m是维度,通过dimension by确定,而且顺序与dimension by一致。
SELECT r, y, m, s
FROM sales_history
WHERE month <= 10
MODEL
RETURN UPDATED ROWS
PARTITION BY (region_id r)
DIMENSION BY (year y, month m)
MEASURES (sales s)
--y=2004因为不存在,所有没有结果,改为2001可以
--s[y between 2000 and 2001,m=3]
--s[2004,m=3]也不行,只要规则左边有一个符号引用,有一个维度不存在就不行
--s[y in (2000,2001),m=3]
-- s[y in (2000,2004),m=3]因为2004的不存在此单元格,所以符号引用没有这个结果,但是2000的存在。
--s[y<=2001,m=3]
RULES (s[y=2001,m=3] = 200000)
ORDER BY y, r, m;
上面语句的意思是对year=2001,month=3的所有数据的sales置为200000。
比如上面的符号单元格引用写成s[y<=2001,m=3]那么则会将2000年和2001年的3月各区域销售都改为200000。
位置单元格也就是对于每个维度的确定是通过dimension by中维度列的顺序确定的,与符号单元格比较,位置单元格引用没有名字,只有值,如上面的使用位置单元格就是:
s[2004,3] //顺序是dimension by确定的名字的对应值。
改写上面的例子为:
SELECT r, y, m, s
FROM sales_history
WHERE month <= 10
MODEL
RETURN UPDATED ROWS
PARTITION BY (region_id r)
DIMENSION BY (year y, month m)
MEASURES (sales s)
RULES (s[2004,3] = 200000)
ORDER BY y, r, m;
注意:
虽然sales_history表中不存在2004年的数据,但是使用位置单元格引用,根据分区和纬度定义,能够预测到2004年3月的数据。这是位置单元格引用和符号单元格引用的一个很大区别,符号单元格引用必须确定找到单元格,但是位置单元格引用则没有这个要求。
符号和位置单元格可以混用,如下:
SELECT r, y, m, s
FROM sales_history
WHERE month <= 10
MODEL
RETURN UPDATED ROWS
PARTITION BY (region_id r)
DIMENSION BY (year y, month m)
MEASURES (sales s)
RULES (s[2000,m=3] = (s[2000,3]+s[y=2001,m=3])/2)
ORDER BY y, r, m;
上面的例子中,有的使用位置单元格引用,有的使用符号单元格引用。混合单元格引用注意如果规则左边只要使用了符号引用,有一个维度不存在,此范围内的单元格不会有结果,右边不受影响,右边不存在默认结果为NULL,见下节详细介绍。