oracle model 分组,oracle model子句学习笔记例 解析

学习 东方醉仙 的 “oracle model子句学习笔记例”,并记之

总看model子句

SELECT PRODUCT, COUNTRY, YEAR, WEEKS, RECEIPTS, SALE, INVENTORY FROM SALES_FACT

WHERE /*COUNTRY = 'Australia'

AND PRODUCT = 'Xtend Memory'

AND */

YEAR = '2001'

AND WEEKS <= 5

AND ROWNUM <= 50

/*MODEL 标示字*/

MODEL

/*RETURN {ALL|UPDATED} ROWS 返回的结果集是否只包含修改或新增的记录,默认是ALL*/

RETURN UPDATED ROWS

/*PARTITION BY 按参数中的列分组,之后的运算都是分组进行的;参数可以是表达式,但是必须有别名*/

PARTITION BY(PRODUCT, COUNTRY)

/*DIMENSION BY 声明各分组中的维度字段,相当于多维键值对的建,字段值即键;参数可以是表达式,但是必须有别名*/

DIMENSION BY(YEAR, WEEKS)

/*MEASURES 声明各分组中的指标字段,即键值对中的值;参数可以是表达式,但是必须有别名*/

MEASURES(0 INVENTORY, RECEIPTS, SALE)

/*AUTOMATIC ORDER|SEQUENTIAL ORDER 指标计算的顺序,逻辑依赖顺序|书写顺序,默认是SEQUENTIAL ORDER 。*/

RULES AUTOMATIC

ORDER

/*-6.008 = 12.016 + 162.216 - 180.24*/

(INVENTORY [ YEAR, WEEKS ] = NVL(INVENTORY [ CV(YEAR), CV(WEEKS) - 1 ], 0)

/**/

+RECEIPTS [ CV(YEAR), CV(WEEKS) ]

/**/

-SALE [ CV(YEAR), CV(WEEKS) ]

/**/

)

ORDER BY PRODUCT, COUNTRY, WEEKS, RECEIPTS, SALE

excel对应部分公式见 http://download.csdn.net/detail/jgmydsai/6014673

位置标记

SELECT PRODUCT, COUNTRY, YEAR, WEEKS, RECEIPTS, SALE, INVENTORY

FROM SALES_FACT

WHERE COUNTRY = 'Australia'

AND PRODUCT = 'Xtend Memory'

AND YEAR IN ('2001', '2002')

AND WEEKS <= 5

/*MODEL 标示字*/

MODEL

/*RETURN {ALL|UPDATED} ROWS 返回的结果集是否只包含修改或新增的记录,默认是ALL*/

RETURN UPDATED ROWS

/*PARTITION BY 按参数中的列分组,之后的运算都是分组进行的;参数可以是表达式,但是必须有别名*/

PARTITION BY(PRODUCT, COUNTRY)

/*DIMENSION BY 声明各分组中的维度字段,相当于多维键值对的建,字段值即键;参数可以是表达式,但是必须有别名*/

DIMENSION BY(YEAR, WEEKS)

/*MEASURES 声明各分组中的指标字段,即键值对中的值;参数可以是表达式,但是必须有别名*/

MEASURES(0 INVENTORY, RECEIPTS, SALE)

/*AUTOMATIC ORDER|SEQUENTIAL ORDER 指标计算的顺序,逻辑依赖顺序|书写顺序,默认是SEQUENTIAL ORDER 。*/

RULES AUTOMATIC

ORDER

/**/

(INVENTORY [ YEAR, WEEKS ] = NVL(INVENTORY [ CV(YEAR), CV(WEEKS) - 1 ], 0)

/**/

+RECEIPTS [ CV(YEAR), CV(WEEKS) ]

/**/

-SALE [ CV(YEAR), CV(WEEKS) ],

/*原数据中没有2002新增一行*/

SALE [ 2002, 1 ] = 0,

/**/

RECEIPTS [ 2002, 1 ] = 0

/**/

)

符号标记

SELECT PRODUCT, COUNTRY, YEAR, WEEKS, SALE

FROM SALES_FACT

WHERE PRODUCT = 'Xtend Memory'

AND COUNTRY = 'Australia'

MODEL

/*只返回修改过和数据*/

RETURN UPDATED ROWS

PARTITION BY(PRODUCT, COUNTRY)

DIMENSION BY(YEAR, WEEKS)

MEASURES(SALE)

RULES /**/

(SALE [ YEAR IN ('2000', '2001'),

WEEKS IN (1, 2) ] ORDER BY YEAR,

WEEKS = SALE [ CV(YEAR),

CV(WEEKS) ] * 1.2

/**/)

ORDER BY YEAR, WEEKS;

/*等价于*/

SELECT PRODUCT, COUNTRY, YEAR, WEEKS, SALE * 1.2 AS SALE

FROM SALES_FACT

WHERE PRODUCT = 'Xtend Memory'

AND COUNTRY = 'Australia'

AND YEAR IN ('2000', '2001')

AND WEEKS IN (1, 2);

model子句中for循环

SELECT PRODUCT,COUNTRY,YEAR,WEEKS,RECEIPTS,SALE--,INVENTORY

FROM SALES_FACT

WHERE PRODUCT = 'Xtend Memory'

AND COUNTRY = 'Australia'

AND YEAR = '2001'

AND WEEKS <= 10

MODEL RETURN UPDATED ROWS

PARTITION BY (PRODUCT,COUNTRY)

DIMENSION BY (YEAR,WEEKS)

MEASURES(RECEIPTS,SALE,0 INVENTORY)

RULES AUTOMATIC ORDER

(

INVENTORY[YEAR,WEEKS] = NVL(INVENTORY[CV(YEAR),CV(WEEKS)-1],0)

+ RECEIPTS[CV(YEAR),CV(WEEKS)]

- SALE[CV(YEAR),CV(WEEKS)],

/*FOR 循环 符合条件数据改为0*/

SALE[2001,FOR WEEKS FROM 3 TO 10 INCREMENT 1] = 0,

RECEIPTS[2001,FOR WEEKS FROM 3 TO 10 INCREMENT 1] = 0

)

ORDER BY WEEKS,RECEIPTS,SALE

关于return updated rows子句

SELECT PRODUCT,COUNTRY,YEAR,WEEKS,SALE

FROM SALES_FACT

WHERE PRODUCT = 'Xtend Memory'

AND COUNTRY = 'Australia'

MODEL

/*返回所有数据包括修改及未修改的*/

RETURN ALL ROWS

PARTITION BY (PRODUCT,COUNTRY)

DIMENSION BY (YEAR,WEEKS)

MEASURES(SALE)

RULES

(

SALE[YEAR IN('2000','2001'),WEEKS IN(1,2)]

ORDER BY YEAR,WEEKS

= SALE[CV(YEAR),CV(WEEKS)]*1.2

)

ORDER BY YEAR,WEEKS

在model子句中使用聚合函数

SELECT PRODUCT,COUNTRY,YEAR,WEEKS,SALE,AVG_SALE,INVENTORY,MAX_INVTY

FROM SALES_FACT

WHERE PRODUCT = 'Xtend Memory'

AND COUNTRY = 'Australia'

AND YEAR = '2001'

AND WEEKS <= 10

MODEL RETURN UPDATED ROWS

PARTITION BY (PRODUCT,COUNTRY)

DIMENSION BY (YEAR,WEEKS)

MEASURES (RECEIPTS,SALE,0 INVENTORY,0 AVG_SALE,0 MAX_INVTY)

RULES AUTOMATIC ORDER

(

INVENTORY[YEAR,WEEKS] = NVL(INVENTORY[CV(YEAR),CV(WEEKS)-1],0)

+ RECEIPTS[CV(YEAR),CV(WEEKS)]

- SALE[CV(YEAR),CV(WEEKS)],

AVG_SALE[YEAR,ANY] = AVG(SALE)[CV(YEAR),WEEKS],

MAX_INVTY[YEAR,ANY] = MAX(INVENTORY)[CV(YEAR),WEEKS]

)

ORDER BY WEEKS,SALE,INVENTORY

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值