Funciones Analíticas actuando sobre Funciones de Agregación
En Oracle se pueden componer funciones analíticas con funciones de agregación.
Las funciones analíticas permiten calcular agregados para un grupo y un orden determinado sin necesidad de aplicar GROUP BY/ORDER BY a la consulta completa:
SUM () OVER(PARTITION BY … ORDER BY ….)
COUNT() OVER(PARTITION BY … ORDER BY ….)
RANK() OVER(PARTITION BY … ORDER BY ….)
DENSE_RANK OVER(PARTITION BY … ORDER BY ….)
AVG() OVER(PARTITION BY … ORDER BY ….)
Por otro lado, las funciones de Agregación actúan sobre un conjunto de valores, que puede estar agrupado mediante una cláusula GROUP BY o no; y devuelven un valor para cada, como por ejemplo:
MIN()
MAX()
SUM()
COUNT()
AVG()
Imaginemos la siguiente situación: tenemos una tabla de alumnos, una tabla de cursos, y una tabla de los alumnos que asisten a cada curso, que llamaremos curso__alumno.
Queremos un listado de los cursos ordenados por nombre, que muestre el número de alumnos en cada curso, pero además, un acumulado del número de alumnos. Una primera aproximación puede ser usar subconsultas:
SELECT Nombre, Alumnos, SUM(Alumnos) OVER(ORDER BY Nombre)
FROM (
SELECT C.Nombre, COUNT(*) Alumnos
FROM CURSO C
JOIN CURSO__ALUMNO CA
ON C.Curso_Id = CA.Curso_Id
GROUP BY C.Curso_Id, C.Nombre)
Otra forma de hacer lo mismo, pero más compacta, es «componer» las funciones (sí, como en la universidad se hacía «composición de funciones», metiendo una función dentro de otra):
SELECT
C.Nombre,
COUNT(*) Alumnos,
SUM(COUNT(*)) OVER(ORDER BY C.Nombre)
FROM CURSO C
JOIN CURSO__ALUMNO CA
ON C.Curso_Id = CA.Curso_Id
GROUP BY C.Curso_Id, C.Nombre
COMPÁRTELO:
Fuentes.
Artículo: "Funciones Analíticas actuando sobre Funciones de Agregación" Publicado en http://blog.osoft.es/ (oSoft Blog) por Yván Ecarri el 24 de marzo de 2016. Consultado el 04/09/2022.
No hay comentarios:
Publicar un comentario