Existem consultas que precisamos informar uma posição dos valores retornados da consulta. Para esses casos vamos aprender a criar um ranque dessas informações.
A função Rank trabalha em conjunto com a clausula Order By, a fim de gerar uma classificação baseada na própria expressão do Order By.
No Exemplo abaixo vou lista os funcionários na mesma ordem de inserção, para isso utilizo a função RowNum.
SELECT NOME, SALARIO, ROWNUM
FROM FUNCIONARIO
Agora vamos criar o ranque dos valores, e perceba que a posição inicial será alterada.
SELECT NOME, SALARIO, RANK() OVER (ORDER BY SALARIO) AS RANK_SAL
FROM FUNCIONARIO
ORDER BY SALARIO
Perceba que os valores estão ordenados e na coluna RANK_SAL, podemos notar esse ranque que foi listado. Porém, percebemos que depois da posição 3 passa para a posição 5, isso acontece por que quando temos duas linhas com o mesmo valor a próxima posição não é atualizada, deixando assim na ordem da posição da linha. Para resolver esse problema, podemos utilizar uma outra função analítica do Oracle a Dense_Rank.
Segue o exemplo abaixo como ficaria:
SELECT NOME, SALARIO, DENSE_RANK() OVER (ORDER BY SALARIO) AS DENSE_RANK_SAL
FROM FUNCIONARIO
ORDER BY SALARIO
Percebemos que agora depois da posição 3 vem a 4 como deveria ser.
Espero que essas funções possam ajudar no seu dia a dia.
Abraços.