ORACLE 10G & SQL MODLE

10G 技术文档中对MODLE的描述

概述

利用 SQL MODEL 子句,您可以根据查询结果定义多维数组,然后将规则应用于该数组以计算新值。这些规则可以是复杂的相互依赖的计算。与外部解决方案相比,通过将高级计算集 成到数据库中,可以大幅度提升性能、可伸缩性以及可管理性。用户可以将数据保留在 Oracle 环境内,而无需将数据复制到单独的应用程序或 PC 电子表格中。

MODEL 子句通过将查询列映射到以下三组来定义多维数组:分区列、维度列和度量列。这些元素执行以下任务:

分区以类似于分析函数的分区方式(在数据仓库指南中标题为“数据仓库中用于分析的 SQL”的一章中有述)来定义结果集的逻辑块。将 MODEL 规则应用于每分区的单元格。

维度用于标识分区内的每个度量单元格。这些列用于标识日期、区域以及产品名之类的特征。

度量类似于星型模式中事实表的度量。它们通常包含数值,例如销售单位或成本。通过指定每个单元格的完整维度组合,可以在单元格所处的分区内对其进行访问。

要针对这些多维数组创建规则,您需要定义以维度值形式表达的计算规则。规则灵活且简洁,并且可以使用通配符和 FOR 循环,以最大限度地表达您的意图。利用 MODEL 子句构建的计算通过将分析集成到数据库中改善了传统的电子表格计算,通过符号引用提高了可读性,并提供了可伸缩性和更好的可管理性。

测试案例:

按月份得到quantity的累加值

SQL >   with  tmp  as  (
  
2    select   ' Jan '   Month , 100  Quantity  from  dual
  
3    union
  
4    select   ' Feb ' , 200   from  dual
  
5    union
  
6    select   ' Mar ' , 340   from  dual
  
7    union
  
8    select   ' Apr ' , 200   from  dual
  
9    union
 
10    select   ' May ' , 250   from  dual
 
11   )  select   Month ,Quantity_count  from
 
12   tmp
 
13   model  ignore nav  /*  &keep nav */
 
14   partition  by  ( ' X '   as  x)
 
15   dimension  by  ( Month )
 
16   measures (Quantity  as  Quantity_count)
 
17   rules
 
18   (Quantity_count [ 'Jan' ] = Quantity_count [ 'Jan' ] ,
 
19   Quantity_count [ 'Feb' ] = Quantity_count [ 'Jan' ] + Quantity_count [ 'Feb' ] ,
 
20   Quantity_count [ 'Mar' ] = Quantity_count [ 'Feb' ] + Quantity_count [ 'Mar' ] ,
 
21   Quantity_count [ 'Apr' ] = Quantity_count [ 'Mar' ] + Quantity_count [ 'Apr' ] ,
 
22   Quantity_count [ 'May' ] = Quantity_count [ 'Apr' ] + Quantity_count [ 'May' ]
 
23   )
 
24    /
 
MONTH  QUANTITY_COUNT
-- --- --------------
Apr               840
Feb              
300
Jan              
100
Mar              
640
May             
1090
 
SQL
>

同样累加值也可以通过下面语句得到

SQL >  
SQL
>   with  tmp  as  (
  
2    select   ' 1 '   Month , 100  Quantity  from  dual
  
3    union
  
4    select   ' 2 ' , 200   from  dual
  
5    union
  
6    select   ' 3 ' , 340   from  dual
  
7    union
  
8    select   ' 4 ' , 200   from  dual
  
9    union
 
10    select   ' 5 ' , 250   from  dual
 
11   ) select  t1. month , sum (t2.quantity) Quantity_count
 
12    from  tmp t1  left   join  tmp t2
 
13    on  t2. month <= t1. month
 
14    group   by  t1. month
 
15    order   by   1
 
16    /
 
MONTH  QUANTITY_COUNT
-- --- --------------
1                  100
2                  300
3                  640
4                  840
5                 1090
 
SQL
>

 其中指定ignore nav&keep nav处理  NULL 度量和缺失单元格

更多说明及案例请参考ORACLE官方说明

 http://www.oracle.com/technology/global/cn/obe/10gr2_db_single/bidw/sqlmodel/sqlmodel_otn.htm#t8

 

你可能感兴趣的:(oracle)