Bry*_*ant 6 oracle customization plsql analytic-functions oracle11g
我知道在Oracle中,可以创建自定义聚合函数来处理值集合并返回单个结果.编辑:我甚至阅读了docs.oracle.com/cd/B28359_01/appdev.111/b28425/aggr_functions.htm上的友好手册!
我还知道Oracle提供了类似和的内置分析函数,它们为每个输入提供相对于输入值的集合/窗口的值.DENSE_RANKRATIO_TO_REPORT
我想知道的是,是否有一种方法可以创建我自己的分析函数,可能与我可以创建自己的聚合函数的方式相似,特别是在我的自定义分析函数中创建一个带有附加参数的函数.
当我提到"分析函数"时,请将其读作一个函数,除了通过PARTITION关键字接受窗口参数外,还可以在给定窗口内返回不同的值.(如果有人有更好的术语,请告诉我!纯粹的分析功能?DENSE_RANK- 分析功能?非聚合分析功能?)
Oracle文档指出聚合函数可以用作分析(窗口)函数.不幸的是,这仅意味着PARTITION用于在分析函数中指定窗口的关键字也可以应用于聚合函数.它不会将聚合函数提升到我能够在固定窗口内返回不同值的令人垂涎的状态.
SELECT SUM(income) OVER (PARTITION BY first_initial) AS total FROM data;
将拥有尽可能多的记录data,但它只有与total第一个首字母一样多的不同s.
SELECT RATIO_TO_REPORT(income) OVER (PARTITION BY first_initial) AS ratio FROM data;
将拥有尽可能多的记录data,即使在给定的first_initial分区内,这些记录ratio也可能是不同的.
我已经提供了对PL/SQL过程的只调用访问,该过程接受数字集合作为IN OUT参数,并且具有一些其他IN配置参数.该过程以受配置参数影响的方式修改集合的值(将其视为"大学专有制裁和所需等级弯曲程序").
目前,使用该过程的过程是硬编码检测从一个数据分区到另一个数据分区的变化的游标循环,然后在每个分区内将数据提取到一个集合中,然后将该集合传递给过程,更改并最终转出进入一个单独的表.我计划通过创建一个PIPELINED PARALLEL_ENABLE封装了一些逻辑的表函数来改进这个,但我更喜欢启用如下的查询:
SELECT G.Course_ID
     , G.Student_ID
     , G.Raw_Grade
     , analytic_wrapper(G.raw_grade, P.course_config_data)
                  OVER (PARTITION BY G.Course_ID) AS Adjusted_Grade
     , P.course_config_data
  FROM      grades   G
  LEFT JOIN policies P
  ON G.Course_ID = P.Course_ID;
这需要能够创建自定义分析函数,并且由于过程在不同分区上需要不同输入的方式(例如上面Course_ID特定的P.course_config_data),它还必须不仅接受要聚合的数据参数,还有额外的投入.
这可能,如果可以,我在哪里可以找到文件?我的Google-fu让我失望了.
我提供的PL/SQL过程(有效)是非确定性的,其输出具有必须保留的统计属性.例如,如果A={A[0], A[1], A[3]}是一个特定类的原始等级,并且B=f(A)是A在1:00 C=f(A)调用过程的结果,而是A在1:15 调用过程的结果,那么B={B[0],B[1],B[2]}并且C={C[0],C[1],C[2]}都是可接受的输出要使用,但是这些元素的混合物{C[0],B[1],C[2]}是不可接受的.
这样做的结果是必须在每个分区上只调用一次该过程.(从技术上讲,可以根据需要浪费多次调用它,但分区的所有结果必须来自同一个调用).
例如,假设我提供的程序操作如下:它接受一组成绩作为IN OUT参数,然后将随机选择的其中一个成绩设置为100.所有其他成绩设置为零.在下午1点运行这可能会导致Alice拥有唯一的及格分数,而在下午1:01运行它可能会导致Bob获得唯一的及格分数.无论如何,应该是每个班级只有一名学生通过,不多也不少.
| 归档时间: | 
 | 
| 查看次数: | 1909 次 | 
| 最近记录: |