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.