Funciones ordenación:ROW_NUMBER, RANK y DENSE_RANK

ROW_NUMBER, RANK y DENSE_RANK son funciones de ordenación dentro de una partición. La función ROW_NUMBER es una función analítica, que asigna un valor único dentro una partición según un orden determiado. El valor parte de 1.

Diferencias entre ROW_NUMBER, RANK y DENSE_RANK sería:

  • ROW_NUMBER: asigna numeros contiguos y unicos desde 1 hasta el último según la ordenación y por cada partición
  • RANK: Es igual a ROW__NUMBER, pero no asigna numeros unicos cuando en una ordenación hay dos registros que toman la misma posición
  • DENSE_RANK: tampoco asigna numeros unicos, pero si asigna numeros contiguos.

Al utilizar ROW_NUMBER, hay que tener cuidado en que el orden sea único, si no fuera así nos numeraría aleatoriamente los registros, que cumplan el mismo orden.

SINTAXIS:

función () OVER
    ([PARTITION BY <expresion_valor_2> [,<expresion_valor_3>, ...]])
    ORDER BY <expresion_valor_1> [ASC|DESC] 
    [NULLS FIRST | NULLS LAST] [,…])

Función: ROW_NUMBER, RANK o DENSE_RANK
Expresion_valor_2, Expresion_valor_3, …: Puede ser una columna u otra función no analítica a obtener
Expresion_valor_1: Puede ser una columna u otra función no analítica a obtener

EJEMPLO:

CREATE TABLE tabla
(clave NUMBER,
 cantidad NUMBER,
 bloque NUMBER);
 
INSERT INTO tabla (clave, cantidad, bloque) VALUES (1, 1, 1);
INSERT INTO tabla (clave, cantidad, bloque) VALUES (2, 1, 1);
INSERT INTO tabla (clave, cantidad, bloque) VALUES (3, 2, 1);
INSERT INTO tabla (clave, cantidad, bloque) VALUES (4, 2, 1);
INSERT INTO tabla (clave, cantidad, bloque) VALUES (5, 2, 1);
INSERT INTO tabla (clave, cantidad, bloque) VALUES (6, 4, 1);
INSERT INTO tabla (clave, cantidad, bloque) VALUES (7, 5, 2);
INSERT INTO tabla (clave, cantidad, bloque) VALUES (9, 7, 2);
INSERT INTO tabla (clave, cantidad, bloque) VALUES (10,8, 2);
INSERT INTO tabla (clave, cantidad, bloque) VALUES (11,9, 2);
commit;
SELECT clave, cantidad, bloque,
       ROW_NUMBER() OVER (order by clave) fn_row_number,
       ROW_NUMBER() OVER (PARTITION BY bloque order by clave) fn_row_number,
       RANK() OVER (PARTITION BY bloque order by cantidad) fn_rank,
       DENSE_RANK() OVER (PARTITION BY bloque order by cantidad) fn_dense_rank
 FROM TABLA
ORDER BY bloque, clave;

    CLAVE   CANTIDAD     BLOQUE FN_ROW_NUMBER FN_ROW_NUMBER    FN_RANK FN_DENSE_RANK
--------- ---------- ---------- ------------- ------------- ---------- -------------
        1          1          1             1             1          1             1
        2          1          1             2             2          1             1
        3          2          1             3             3          3             2
        4          2          1             4             4          3             2
        5          2          1             5             5          3             2
        6          4          1             6             6          6             3
        7          5          2             7             1          1             1
        9          7          2             8             2          2             2
       10          8          2             9             3          3             3
       11          9          2            10             4          4             4

Utilización de la función ROW_NUMBER, para realizar paginaciones.
EJEMPLO:

SELECT  *
  FROM (SELECT clave, cantidad, bloque,
        	      ROW_NUMBER() OVER (order by clave) elemento
               FROM tabla
         ORDER BY elemento, clave)
  WHERE elemento BETWEEN 3 and 8;


   CLAVE   CANTIDAD     BLOQUE   ELEMENTO
-------- ---------- ---------- ----------
       3          2          1          3
       4          2          1          4
       5          2          1          5
       6          4          1          6
       7          5          2          7
       9          7          2          8

Comments are closed.