SSI SELAE

RANK() y DENSE_RANK()

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.

Comments are closed.