日期:2014-05-16  浏览次数:20841 次

请教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    1
7176    2
5428    3
77    4
55    5
30    6
25    7

--sql2

 SELECT N
 FROM 
 ( SELECT N,row_number() over(ORDER BY n DESC) rn FROM t)
 WHERE rn=1

--result
7820


 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)