使用 plsql 的用户定义的自定义聚合函数
Posted
技术标签:
【中文标题】使用 plsql 的用户定义的自定义聚合函数【英文标题】:user defined custom aggregate function using plsql 【发布时间】:2012-11-06 23:38:45 【问题描述】:我有一个问题。我使用的工具不接受子查询。所以我必须编写一个用户定义的自定义聚合函数来执行以下操作。
示例:col1 和 col2 具有数字数据类型。
**col1** **col2**
243 401
57489 400
2789 401
598 400
SELECT sum(MinValue)
FROM
(SELECT Min(col1) AS MinValue,col2
FROM
Table1
GROUP BY col2)
Output:841
我希望此查询通过使用单个函数而不是如上所示的查询在一个步骤中工作。比如:
SELECT MyMinSum(col1, col2),col3 from table1 Group by col3;
我希望这是有道理的。对此我将不胜感激。
【问题讨论】:
【参考方案1】:如果您正在寻找与使用子查询的选择语句相同的输出,您可以通过
获得相同的结果 SELECT SUM (MIN (col1)) AS minvalue
FROM Table1
GROUP BY col2
【讨论】:
【参考方案2】:最好的方法可能是将你的 SQL 放在一个视图中,假设它适用于你的工具。
但如果您真的需要自定义聚合函数,有两种主要方法可以实现。典型的方式是使用Oracle Data Cartridge Interface,比如流行的STRAGG。但根据我的经验,Data Cartridge 令人困惑,充满了 bug,而且速度很慢。通常COLLECT
函数效果更好。请参阅下面的示例,或此SQL Fiddle。
create table table1(col1 number, col2 number, col3 number)
/
insert into table1
select 243, 401, 1 from dual union all
select 57489, 400, 1 from dual union all
select 2789, 401, 1 from dual union all
select 598, 400, 1 from dual union all
select 598, 400, 2 from dual
/
create or replace type col1_col2_obj is object
(
col1 number,
col2 number
)
/
create or replace type col1_col2_nt is table of col1_col2_obj
/
create or replace function MyMinSum(p_col1_col2_nt in col1_col2_nt)
return number is
v_result number;
begin
SELECT sum(MinValue)
INTO v_result
FROM
(
SELECT Min(col1) AS MinValue,col2
FROM
table(p_col1_col2_nt)
GROUP BY col2
);
return v_result;
end;
/
select
MyMinSum(cast(collect(col1_col2_obj(col1, col2)) as col1_col2_nt)) test
,col3
from table1
group by col3
/
TEST COL3
841 1
598 2
【讨论】:
以上是关于使用 plsql 的用户定义的自定义聚合函数的主要内容,如果未能解决你的问题,请参考以下文章