Como nunca me acuerdo de la diferencia entre RANK() y DENSE_RANK(), me pongo este ejemplo para ver la diferencia:
WITH employees AS
(SELECT 10 AS department_id, 'APELLIDO1' AS last_name, 12 AS salary
FROM dual
UNION
SELECT 10 AS department_id, 'APELLIDO2' AS last_name, 12 AS salary
FROM dual
UNION
SELECT 10 AS department_id, 'APELLIDO3' AS last_name, 2 AS salary
FROM dual
UNION
SELECT 10 AS department_id, 'APELLIDO4' AS last_name, 2 AS salary
FROM dual
UNION
SELECT 10 AS department_id, 'APELLIDO5' AS last_name, 10 AS salary
FROM dual
UNION
SELECT 10 AS department_id, 'APELLIDO6' AS last_name, 1 AS salary
FROM dual)
SELECT department_id,
last_name,
salary,
rank() over(PARTITION BY department_id ORDER BY salary DESC) "Rank",
dense_rank() over(PARTITION BY department_id ORDER BY salary DESC) "Dense_Rank"
FROM employees;
| DEPARTMENT_ID | LAST_NAME | SALARY | Rank | Dense_Rank | |
|---|---|---|---|---|---|
| 1 | 10 | APELLIDO1 | 12 | 1 | 1 |
| 2 | 10 | APELLIDO2 | 12 | 1 | 1 |
| 3 | 10 | APELLIDO5 | 10 | 3 | 2 |
| 4 | 10 | APELLIDO4 | 2 | 4 | 3 |
| 5 | 10 | APELLIDO3 | 2 | 4 | 3 |
| 6 | 10 | APELLIDO6 | 1 | 6 | 4 |
Como se puede ver en los resultados, RANK() deja huecos en la clasificación pues tiene en cuenta los valores duplicados, por otro lado, DENSE_RANK() no deja huecos en la clasificación aunque existan duplicados.