lunes, 24 de abril de 2023

Oracle 23c - SUM y AVG con tipo de datos INTERVAL

Otra mejora que ofrece Oracle Database 23c es la que nos permite realizar agregaciones de tipo SUM (suma) o AVG (promedio) con datos del tipo INTERVAL.

Esto nos resulta muy útil, por ejemplo, cuando el dato de tipo INTERVAL representa tiempo transcurrido o necesario para diversas tareas, y queremos saber cuanto es el total de tiempo necesario para completar todo el proceso, o cual es la duración promedio de las tareas que lo componen.


Escenario

Vamos a construir una tabla de Tareas, la cual contiene un ID y Nombre de Tarea, un Tipo de Objeto, una fecha de inicio y fin de la tarea, y la duración de la misma expresada con el tipo de datos INTERVAL. Para ello vamos a usar como origen la vista ALL_OBJECTS del diccionario de datos, como mostramos a continuación:

CREATE TABLE tTareas AS SELECT ao.Object_ID AS ID_Tarea, 'Crear ' || ao.Object_name AS Tarea, ao.object_type AS TipoObjeto, ao.Created AS Inicio, ao.Last_DDL_Time AS Fin, CAST(Last_DDL_Time AS TIMESTAMP) - CAST(Created AS TIMESTAMP) AS Duracion FROM all_objects ao WHERE ao.Created <> ao.Last_DDL_Time ORDER BY 1 FETCH FIRST 100 ROWS ONLY;

Si consultamos algunos datos de la misma, veremos que la columna Duracion es de tipo de datos INTERVAL: 

SELECT * FROM tTareas FETCH FIRST 10 ROWS ONLY;


SUM con INTERVAL

A continuación, vamos a mostrar como se puede utilizar la función SUM para ver el total de tiempo insumido en las tareas, agrupando en este caso las mismas por tipo de objeto:

SELECT TipoObjeto, SUM(Duracion) AS DuracionTotal, COUNT(*) AS NroObjetos FROM tTareas GROUP BY TipoObjeto;

Y podemos ver como obtenemos los resultados deseados:


AVG con INTERVAL

Así como obtuvimos el tiempo total insumido por cada tipo de objeto, podemos aplicar la función AVG para obtener el promedio:

SELECT TipoObjeto, AVG(Duracion) AS TiempoPromedio, COUNT(*) AS NroObjetos FROM tTareas GROUP BY TipoObjeto;

Podemos ver los resultados a continuación, y en el caso de "EDITION", al ser solo un objeto, el tiempo promedio es igual a la duración total que calculamos en el ejemplo anterior:


Funciones Analíticas

Así como usamos SUM y AVG como funciones de agregación, es posible usarlas como funciones analíticas con datos de tipo INTERVAL, como vemos a continuación:


SELECT Tarea, Duracion, SUM(Duracion) OVER(ORDER BY ID_Tarea) AS Acumulado FROM tTareas WHERE TipoObjeto = 'TABLE';


Lo que vemos es la duración acumulada, tarea tras tarea (conocido como RUNNING TOTAL), en vez de el resultado "total" final:


Conclusión

Ahora es posible realizar operaciones de agregación como SUM y AVG en datos de tipo INTERVAL, para poder obtener tanto sumatorias de tiempo transcurrido como su promedio.


Si desean conocer más sobre Oracle 23c, es recomendable que vean estos artículos en este blog como punto de partida:

Adicionalmente, pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.

 

No hay comentarios.:

Publicar un comentario