【发布时间】:2015-11-19 13:54:12
【问题描述】:
背景
我知道在 Oracle 中可以创建 custom aggregate functions 来处理一组值并返回一个结果。 编辑:我什至阅读了 docs.oracle.com/cd/B28359_01/appdev.111/b28425/aggr_functions.htm 上的友好手册!
我也知道 Oracle 提供 built-in analytic functions,如 DENSE_RANK 和 RATIO_TO_REPORT,它们为每个输入提供值,相对于输入所在的值的集合/窗口。
问题
我想知道是否有一种方法可以创建我自己的分析函数,大概与我可以创建自己的聚合函数类似的方式,特别是创建一个 我的自定义分析函数中的其他参数。
微妙的术语警告
当我提到“分析函数”时,请将其理解为一个函数,除了通过PARTITION 关键字接受窗口参数外,还可以在给定窗口内返回不同的值。 (如果有人对此有更好的说法,请告诉我!纯解析函数?DENSE_RANK-class 解析函数?非聚合解析函数?)
Oracle 文档指出聚合函数可以用作分析(窗口)函数。不幸的是,这仅意味着用于在分析函数中指定窗口的PARTITION 关键字也可以应用于聚合函数。它不会将聚合函数提升到我梦寐以求的状态,即能够在固定窗口内返回不同的值。
聚合用作分析:
SELECT SUM(income) OVER (PARTITION BY first_initial) AS total FROM data;
将有与data 一样多的记录,但它的不同totals 的数量与第一个首字母一样多。
解析用作解析:
SELECT RATIO_TO_REPORT(income) OVER (PARTITION BY first_initial) AS ratio FROM data;
将拥有与data 一样多的记录,并且即使在给定的first_initial 分区内,那些ratios 也可能都是不同的。
上下文
我已获得对 PL/SQL 过程的仅调用访问权限,该过程接受数字集合作为 IN OUT 参数,并具有一些其他 IN 配置参数。该程序以受配置参数影响的方式修改集合的值(将其想象为“大学专有的认可和要求的成绩曲线程序”)。
目前,使用该过程的过程是硬编码一个游标循环,该循环检测从一个数据分区到另一个数据分区的变化,然后在每个分区内将数据提取到一个集合中,然后将其传递给该过程、更改并最终转储到一个单独的表中。我计划通过创建一个封装了一些逻辑的PIPELINEDPARALLEL_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),它还必须接受不仅data-to-be-aggregated 参数,还有额外的输入。
这可能吗?如果可以,我在哪里可以找到文档?我的 Google-fu 让我失望了。
额外的皱纹
我提供的 PL/SQL 过程(实际上)是不确定的,它的输出具有必须保留的统计属性。例如,如果A={A[0], A[1], A[3]} 是一个特定班级的原始成绩,B=f(A) 是在 1:00 对A 调用过程的结果,而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 有唯一的及格分数。无论如何,应该是每个班级只有一个学生通过,不多也不少。
【问题讨论】:
标签: oracle plsql oracle11g customization analytic-functions