Publicado el Dejar un comentario

Numerar por grupos los resultados de una consulta SQL en Oracle

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!

 

 

Publicado el Dejar un comentario

Numerar los resultados de una consulta SQL en Oracle

Queremos que los resultados de una consulta SQL en una base de datos ORACLE sean numerados del 1 al total de registros o filas obtenidas en la consulta.

Para ello podemos utilizar la función ROW_NUMBER()  de la siguiente forma:

SELECT 
    ROW_NUMBER() OVER (ORDER BY department_name) AS numero_consecutivo,
    department_name 
FROM 
    departments;

Nos daría como resultado algo como esto:

En la sentencia SQL anterior, estamos indicando que numere los resultados de acuerdo al orden del campo DEPARTMENT_NAME (nombre del departamento) y le asigne a esa numeración el nomnre de NUMERO_CONSECUTIVO.  La cláusula ORDER BY en la función ROW_NUMBER() es obligatoria. Este ordenamiento es independiente de el orden que se le puede dar al resultado final. Si sólo existe el ordenamiento de la función ROW_NUMBER() en la sentencia SQL, el resultado de la consulta saldrá ordenado por el orden indicado en ésta. Por ejemplo la siguiente sentencia:

SELECT 
    ROW_NUMBER() OVER (ORDER BY department_name) AS numero_consecutivo,
    department_id,
    department_name 
FROM 
    departments
ORDER BY department_id;

En donde agregamos que muestre el campo DEPARTMENT_ID y que el resultado final lo ordene por éste mismo campo, daría como resultado esto:

Como se puede observar, el orden del resultado ahora es por el campo DEPARTMENT_ID, sin embargo la numeración es asignada de acuerdo al orden del campo DEPARTMENT_NAME. Como vemos el departamento  llamado “Accounting” sigue conservando el número 1 en la columna “NUMERO_CONSECUTIVO”, el departamento “Administration” el número 2 y así sucesivamente.

¿Dudas? Deja tu comentario.

¡Hasta la próxima!