En el post pasado vimos como numerar los resultados de una consulta desde 1 a el total de registros devueltos por la consulta con la función ROW_NUMBER(). Ahora queremos que numere desde 1 hasta el número de registros que exista en cada grupo distinto de datos que regrese la consulta. Para ejemplificar usaremos la consulta siguiente a la tabla EMPLOYEES:
SELECT ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY last_name) AS numero_consecutivo, department_id, last_name FROM employees;
PARTITION BY le indica a la función ROW_NUMBER(), que va a numerar a partir de 1 por cada grupo de registro con diferente valor en el campo DEPARTMENT_ID. ORDER BY le indica que va a numerar los registros de cada grupo de acuerdo al orden ascendente del valor del campo LAST_NAME
Veamos el fragmento del resultado que daría la consulta SQL anterior para entender mejor el funcionamiento:
Como vemos en el resultado, la numeración (columna NUMERO_CONSECUTIVO en el resultado) reinicia con 1 por cada valor de DEPARTMENT_ID distinto y los numera de acuerdo al orden del valor LAST_NAME: en el DEPARTMENT_ID “10” sólo existe 1 empleado y tiene el valor de “Whalen” en el campo LAST_NAME. En el DEPARTMENT_ID “20” existen 2 empleados con los valores “Fay” y “Hartstein” y los numeró de acuerdo al orden alfabético, a “Fay” le dió el NUMERO_CONSECUTIVO “1” y a “Hartstein” el 2. En el DEPARTMENT_ID “30” hay 6 empleados y los numeró del 1 al 6 de acuerdo al orden alfabético de LAST_NAME y así sucesivamente con el resto de los empleados.
Si existiera una clausula ORDER BY en la sentencia, el orden del despliegue de salida sería por los campos indicados en dicha cláusula.
¿Dudas? ¿Preguntas? Deja tus comentarios. ¡Hasta la próxima!