/ / Classificando cada grupo de linhas da tabela - sql, oracle, order

Classificando cada grupo de linhas da tabela - sql, oracle, order

Eu tenho uma tabela com essa estrutura:

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

Esta tabela é enorme e cerca de 500 linhas são inseridas a cada minuto. Para manter a ordem de cada grupo, por nome, estamos usando um gatilho antes da inserção como o seguinte:

begin

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

end;

Isso funciona bem, mas às vezes retorna valores incorretos, por exemplo, (14,8,11,4,5) em vez de (1,2,3,4,5). Investigamos nosso código para não atualizarmos essa coluna.

Qual poderia ser o problema? Se esse método de classificação estiver errado, qual é o melhor método para fazer isso?

Respostas:

1 para resposta № 1

Como afirmado no meu comentário, não vejo razão para os valores serem mais altos do que o esperado. Então eu não posso realmente responder sua pergunta original.

No entanto, sugiro que você use uma seqüência, comotambém mencionado nos meus comentários acima. É garantido que uma sequência funcione com acesso simultâneo, o que a sua abordagem não é. Para ter, por último, valores consecutivos, você usaria uma função agregada para isso:

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

Você pode criar uma visão, escondendo seq_no e mostrando apenas rank_no. Assim, seu cliente obtém o que eles querem ver.