当前位置: 代码迷 >> Oracle技术 >> 请问oracle一个自定义聚合函数 aggregate function 的有关问题,十分感谢
  详细解决方案

请问oracle一个自定义聚合函数 aggregate function 的有关问题,十分感谢

热度:722   发布时间:2016-04-24 08:43:28.0
请教oracle一个自定义聚合函数 aggregate function 的问题,十分感谢!
请教各位神侠,

我想实现一个自定义函数,函数类型为 f_max(列名 column_name, 序号 val),

要求此函数实现 求得列名为 column_name 的这个列的第 val个最大的值。

比如有一个表如下

 CREATE TABLE t (id VARCHAR2(2), n INT);
 INSERT INTO t VALUES ('A',25);
 INSERT INTO t VALUES ('A',30);
 INSERT INTO t VALUES ('A',55);
 INSERT INTO t VALUES ('B',77);
 INSERT INTO t VALUES ('C',7176);
 INSERT INTO t VALUES ('C',5428);
 INSERT INTO t VALUES ('C',7820);

要求

select f_max(n,1) from t 的结果为 7820, 对应为最大的 n,


select f_max(n,2) from t 的结果为 7176, 对应为第二个最大的 n,

...

如能帮助,万分感谢!!!



------解决方案--------------------
SQL code
--不用自己定义吧!--sql1: SELECT N,row_number() over(ORDER BY n DESC) rn FROM t--result:7820    17176    25428    377    455    530    625    7--sql2 SELECT N FROM  ( SELECT N,row_number() over(ORDER BY n DESC) rn FROM t) WHERE rn=1--result7820 SELECT N FROM  ( SELECT N,row_number() over(ORDER BY n DESC) rn FROM t) WHERE rn=2--result:7176
------解决方案--------------------
楼主要实现的功能应该不能在自定义聚合函数中实现,因为首先要把所有值排序才能得到第N大的值,这就需要多次循环,而聚合函数只有一次循环.
------解决方案--------------------
实测请参考:
查询所有:


查询第一大的


查询第三大的



------解决方案--------------------
row_number() over(ORDER BY n DESC)
  相关解决方案