我有一个存储过程,它返回一个游标.
应用程序将一个参数传递给过程,该过程确定应该获取多少ID,因此该过程不知道该数字的时间序列.
foreach ID我需要获取具有该ID的前3个记录.我试过的是使用:
select * from table_name where id in (List of ID`s);
Run Code Online (Sandbox Code Playgroud)
该查询有效,但我无法获得每个ID的前3个.如果我限制结果计数,我将得到第一个ID的TOP结果.
我想使用For循环,为每个ID执行查询并将结果附加到光标,但据我所知,这是不可能的.
有任何想法吗 ?
更多细节
假设我有5个ID,s and each of them have inner Id所以Id 1有(1,2,3,4,5)Id 2(1,2,3,4,5)Id 3(12,14,15,16,22) Id 4(2,3,5,7,9)Id 5(4,7,8,9,10)在这种情况下,我正在处理的情况,我不知道行号将如何帮助我.我需要每个ID的前3个,在这种情况下,光标应该有15个结果.
10倍多,周末愉快;)
据推测,你有一些确定前三名的标准?
无论如何,实现这一目标的方法是使用分析功能.Oracle提供三种不同的功能:ROW_NUMBER(),RANK()和DENSE_RANK().这些对TOP 3提供了三种略有不同的解释. 了解更多信息.
这是基本的想法,使用ROW_NUMBER(),它将为每个ID返回三行.
open rc for
select * from (
select t.*
, row_number() over (partition by id order by whatever ) rn
from table_name t
where t.id in (List of ID`s)
)
where rn <= 3;
Run Code Online (Sandbox Code Playgroud)
在whatever该ROW_NUMBER()子句中的是你用它来确定TOP岬列.