Model子句是在Oracle数据库10g版本中引入的,提供了一个很好的替代电子表格的方法。通过Model子句,可以使用SQL语句中的一些很强大的功能,如聚合、并行、以及多维、多变量分析。如果你喜欢使用excel的电子表格来进行公式计算,你同样也会乐于使用model子句。由于model子句是SQL语言应用的一个扩展,其可扩展性是很强的,近似于oracle数据库的可扩展性。超过几百万行数据的多维、多变量计算,如果不是10亿级数据量的话,可以很容易地通过model子句来实现,而电子表格就不行。同时,很多数据库特性如对象分区以及并行执行都可以在model子句中高效地应用,从而进一步提高了可扩展性。传统的SQL语句与model子句的最核心区别在于model子句支持跨行引用,多单元格引用以及单元格聚合。
语法如下:
MODEL [<global reference options>] [<reference models>] [MAIN <main-name>] [PARTITION BY (<cols>)] DIMENSION BY (<cols>) MEASURES (<cols>) [<reference options>] [RULES] <rule options> (<rule>, <rule>,.., <rule>) <global reference options> ::= <reference options> <ret-opt> <ret-opt> ::= RETURN {ALL|UPDATED} ROWS <reference options> ::= [IGNORE NAV | [KEEP NAV] [UNIQUE DIMENSION | UNIQUE SINGLE REFERENCE] <rule options> ::= [UPDATE | UPSERT | UPSERT ALL] [AUTOMATIC ORDER | SEQUENTIAL ORDER] [ITERATE (<number>) [UNTIL <condition>]] <reference models> ::= REFERENCE ON <ref-name> ON (<query>) DIMENSION BY (<cols>) MEASURES (<cols>) <reference options>
CV() 函数是一个非常强大的工具,它可以高效地进行规则创建。CV() 用于规则的右侧,以复制左侧指定的当前维度值。对于左侧规范引用多个单元格来说,它非常有用。用关系数据库的概念来理解,该函数类似于连接操作。CV() 允许使用非常灵活的表达式。例如,通过从 CV(year) 值进行减法运算,可以引用数据集中的其他行。如果您的单元格引用中有表达式“CV(year) -2”,您两年前就可以访问数据。CV() 函数通常作为单元格引用的一部分使用,但是也可以在单元格引用外部作为独立的表达式元素。
例如:
RULES (
sales['Bounce', year BETWEEN 1995 AND 2002] =
sales['Mouse Pad', cv(year)] +
0.2 * sales['Y Box', cv(year)]
)
当上述规则的左侧引用单元格 Bounce 和 1999 时,右侧表达式将如下所示: sales['Mouse Pad', 1999] + 0.2 * sales['Y Box', 1999]
同样,当左侧引用单元格 Bounce 和 2000 时,右侧表达式将为: sales['Mouse Pad', 2000] + 0.2 * sales['Y Box', 2000]
具体用法参见:http://blog.csdn.net/wh62592855/article/details/4783021