对每组表行进行排名

时间:2013-11-09 07:45:01

标签: sql oracle

我有一个具有这种结构的表:

ID   NAME   RANK
10    A      1
11    A      2
12    A      3
13    A      4
14    B      1
15    B      2

此表非常庞大,每分钟大约插入500行。为了按名称维护每个组的排序,我们使用如下插入触发器:

begin

    SELECT NVL(MAX(RANK+1),1) INTO RANK FROM tablename
    WHERE NAME=:NEW.NAME;

end;

这很有效但有时会返回不正确的值,例如(14,8,11,4,5)而不是(1,2,3,4,5)。我们调查了我们的代码,因此我们没有更新此列。

可能是什么问题?如果这种排名方法是错误的,那么最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

正如我的评论所述,我认为没有理由让价值高于预期。所以我实际上无法回答你原来的问题。

但是,我建议您使用序列,如上面的评论中所述。保证序列可以与并发访问一起使用,而您的方法则不然。要获得最后连续的值,您可以使用聚合函数:

select name, row_number() over (partition by name order by seq_no) as rank_no
from tablename; 

您可以创建视图,隐藏seq_no并仅显示rank_no。因此,您的客户得到了他们想要看到的东西。