`

oracle子句model的梳理

阅读更多

1:规则rules的使用

select ArrValue,soeji
from(select 'abcdefghijklmn' as ArrValue,1 as soeji from dual) model
dimension by(soeji) measures(ArrValue)
rules(ArrValue[1] = 'Hello World');

--rules的缺省行为是存在就更新,不存在则追加

/*使用model return updated rows的话,被rules更新或者插入的行才显
示,没有更新过的行不再作为SQL的结果。*/
select ArrValue,soeji
from(select 'abcdefghijklmn' as ArrValue,1 as soeji from dual)
model return updated rows
dimension by(soeji)
measures(ArrValue)
rules(ArrValue[1] = 'Hello World');


select ArrValue,soeji
from(select 'abcdefghijklmn' as ArrValue,1 as soeji from dual)
model return updated rows
dimension by(soeji)
measures(ArrValue)
rules(ArrValue[null] = ArrValue[1]+ArrValue[1]+ArrValue[1]);


SELECT id,year,month,sales_amount
FROM table_name
WHERE id BETWEEN 1 and 2
AND e_id=21
MODEL
PARTITION BY(id)
DIMENSION BY(month , year)
MEASURES (amount sales_amount) (
  sales_amount[1,2004] = sales_amount[1,2003],
  sales_amount[2,2004] = sales_amount[2,2003],
  sales_amount[3,2004] = ROUND(sales_amount[3,2003]*1.24,2)
)
ORDER BY id, year,month;


更新已有单元、阻止创建新单元(RULES UPDATE):
默认情况下,表达式左边单元如果已经存在,则更新其值,不存在则创建一条新记录
使用RULES UPDATE 可以阻止创建新记录
MEASURE(month, year)
RULES UPDATE(
  sales_amount[FOR month FROM 1 TO 3 INCREMENT 1 ,2004] = sales_amount[CURRENTV(), 2003]
)

 

2:规则MEASURES的使用

使用BETWEEN AND 返回特定范围的数据
sales_amount[1,2004] = ROUND(AVG(sales_amount)[month BETWEEN 1 AND 3,2003],2)


使用ANY 和 IS ANY 访问说有数据单元
ANY匹配的是位置标记,IS ANY 匹配的是符号标记,意思是ANY 所在的位置上,对应该列的所有值,IS ANY 要跟列名合在一齐用
sales_amount[1,2004] = ROUND(SUM (sales_amount)[ANY, year IS ANY], 2)


用CURRENTV()获取某个维度的当前值
sales_amount[1,2004] = sales_amount[CURRENTV(),2003]

for循环访问数据单元
sales_amount [FOR month FROM 1 TO 3 INCREMENT 1, 2004] = sales_amount[CURRENTV(),2003]


处理空值和缺失值

IS PRESENT:
sales_amount[1,2004] =
CASE
WHEN sales_amount[CURRENTV(),2003] IS PRESENT THEN
  sales_amount[CURRENTV(),2003]
ELSE
  0
END


PRESENTV(): 如果cell在MODEL子句前已经存在,PRESENTV(cell, expr1, expr2) 返回表达式1,如果不存在返回expr2
sales_amount[1,2004] = PRESENTV(sales_amount[CURRENTV(),2003], sales_amount[CURRENTV(),2003] , 0)

 

分享到:
评论

相关推荐

    Oracle中使用SQL MODEL定义行间计算

    利用 SQL MODEL 子句,您可以根据查询结果定义多维数组,然后将规则应用于该数组以计算新值。这些规则可以是复杂的相互依赖的计算。与外部解决方案相比,通过将高级计算集 成到数据库中,可以大幅度提升性能、可伸缩...

    08.Oracle的where子句1

    一、生成测试数据用以下SQL创建超女基本信息表(T_GIRL),插入一些测试数据 二、where子句的语法select 字段名1,字段名2,字段名n from

    Oracle start with.connect by prior子句实现递归查询

    Oracle start with.connect by prior子句实现递归查询

    Oracle使用技巧之case子句的用途.docx

    Oracle使用技巧之case子句的用途.docx

    oracle RETURNING 子句使用方法

    主要介绍了oracle RETURNING 子句使用方法,需要的朋友可以参考下

    Oracle SQL高级编程

    第9章 Model子句 225 第10章 子查询因子化 254 第11章 半联结和反联结 292 第12章 索引 334 第13章 SELECT以外的内容 360 第14章 事务处理 386 第15章 测试与质量保证 415 第16章 计划稳定性与控制 443

    Oracle Exception汇总(自定义Oracle异常)

    Oracle Exception汇总(自定义Oracle异常) 使用方法举例: Exception When no_data_found then Dbms_output.put_line(‘no_data_found’); ACCESS_INTO_NULL 为对象赋值前必需初始化对象。对应ORA-06530错误。 CASE...

    oracle中where 子句和having子句中的区别介绍

    主要介绍了在oracle中where 子句和having子句中的区别,本文通过sql语句给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    Oracle Sql 性能优化

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:...

    Oracle11g从入门到精通2

    《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...

    oracle语句优化方法.txt

    ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表...

    实验8 子句集消解实验.docx

    子句集消解实验

    ORACLE SQL性能优化

    比如当一个where子句中的一列有索引时去走索引。 COST (基于成本) 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. CHOOSE (选择性) 如果table已经被analyze过, 优化器...

    oracle菜单树查询

    oracle菜单树查询 使用实例 使用START WITH CONNECT BY PRIOR子句实现递归查询

Global site tag (gtag.js) - Google Analytics