您的位置:首页 > 数据库 > Oracle

oracle编程入门笔记2015-01-28--model子句原理

2015-01-29 10:41 447 查看
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>

model子句功能简述

model子句是根据dimension by(<cols>)指定的列生成一个多维数组,一般都是二维的,measures(<cols>)指定的是需要计算的列。计算规则就是rules。最后再将上述的多维数组转换为表结构。dimension by 和measures指定的列都转换为表里面的行。用图形说明。

原始表的数据如图,有三列,客户名称,客户交易时间,金额



1.没有任何逻辑,先展示一下model的原理

select * from custanalysebydayview

where fcustname = '张卫'

model

dimension by (fcustname,fday)

measures(fmoney fmoney)

rules(fmoney['张卫','16'] = fmoney['张卫','31'])

这段代码将张卫16号的订单额,修改为31号的。



第一步,model将上表按照dimension转换为二维表格,横向为fcustname,纵向为fday(可能反过来,我没有验证,但是不影响最后结果)一个fcustname和一个fday就唯一确定了一个fmoney,如下图所示



第二步,按照rules中的公式计算measures指定的单元格。

fmoney['张卫','16'] = fmoney['张卫','31'] 这个公式对应到上图就是把['张卫','31'] 单元格的值赋值到['张卫','16'] 

最后再把二维表格还原成表结构。形成最终结果。

model还有很多的语法细节参考oracle官方文档:https://docs.oracle.com/database/121/DWHSG/sqlmodel.htm#DWHSG8771
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: