我正在尝试创建用户定义的 avg 函数,例如计算平均值、总和或计数 - 有没有我可以遵循的示例?
问问题
1333 次
2 回答
1
您正在寻找的是Data Cartridge Developers' Guide 中记录的用户定义聚合函数接口。
此处记录了一些示例。
于 2013-05-28T16:43:09.657 回答
1
正如@David Aldridge 提到的,构建用户定义聚合函数的“官方”方法是使用 Oracle Data Cartridge。但根据我的经验,使用该CAST(COLLECT
方法更简单、更快且错误更少。唯一的缺点是您的 SQL 语句需要一些额外的语法。
例如,要创建一个忽略数字 1 的自定义平均函数:
--Created nested table of numbers
create or replace type number_nt is table of number;
--Create a custom average function.
--For example, average everything except the number "1".
create or replace function my_avg(numbers number_nt) return number is
v_sum number := 0;
v_count number := 0;
begin
--Sum and count all the values, excluding nulls and "1".
for i in 1 .. numbers.count loop
if numbers(i) is not null and numbers(i) <> 1 then
v_sum := v_sum + numbers(i);
v_count := v_count + 1;
end if;
end loop;
if v_count = 0 then
return null;
else
return v_sum/v_count;
end if;
end;
/
下面是调用函数的方法:
--Regular average is 2, our custom average that excludes 1 should be 2.5.
select
avg(test_value) avg
,my_avg(cast(collect(test_value) as number_nt)) my_avg
from
(
select 1 test_value from dual union all
select 2 test_value from dual union all
select 3 test_value from dual
);
AVG MY_AVG
-- ------
2 2.5
于 2013-05-28T18:47:29.043 回答