La función AVG en PostgreSQL se utiliza para calcular el promedio (o media aritmética) de un conjunto de valores no nulos. Esta función es clave cuando necesitamos obtener un valor representativo de un conjunto de datos numéricos, como el promedio de ventas, calificaciones o cualquier otra métrica en una tabla.
La función AVG es parte de las funciones de agregación en PostgreSQL, lo que significa que puede aplicarse a un conjunto de registros o dentro de grupos definidos por la cláusula GROUP BY. Es especialmente útil en análisis de datos, reportes y cálculos estadísticos dentro de bases de datos. Cabe destacar que AVG solo considera los valores no nulos, lo que garantiza que el cálculo del promedio no sea distorsionado por datos faltantes.
En este artículo, te guiaré sobre cómo utilizar la función AVG en tus consultas de PostgreSQL para obtener promedios de manera eficiente y cómo puedes optimizar su uso en distintos contextos. Para más información, puedes consultar la documentación oficial de PostgreSQL.
Sintaxis
La sintaxis para utilizar la función AVG en PostgreSQL es la siguiente:
select AVG(expresión) from tabla;
La función AVG no se limita únicamente a la cláusula SELECT
; también puedes utilizarla en otras partes de tus consultas, como las cláusulas WHERE
y HAVING
. Esto te permite realizar filtrados y condiciones basados en promedios calculados directamente en tus conjuntos de datos, ampliando su versatilidad y utilidad en escenarios más complejos.
Ejemplos
Usaremos la siguiente tabla llamada empleados para realizar los ejemplos (al final de la página está disponible el script para crearla)
Ejemplo básico
En el siguiente ejemplo obtenemos la media de sueldos de la tabla empleados:
select AVG(sueldo) from empleados;
Ejemplo agrupando
En este otro ejemplo obtenemos la media por cada puesto. Observa cómo necesitamos establecer una agrupación usandola función AVG en PostgreSQL:
select puesto, AVG(sueldo) from empleados group by puesto;
Recuerda que si en la cláusula SELECT escribes mas campos que no usen la función de agregación, debes incluirlos en el GROUP BY.
Recuerda que en un consulta siempre se evalúa primero la cláusula FROM seguido del WHERE y por ultimo la cláusula SELECT. Más información aquí.
Ejemplo con HAVING
En este otro ejemplo mostramos la media del sueldo agrupado por nombre, pero utilizamos la cláusula HAVING para indicar que la media del sueldo debe ser mayor de 60000:
select nombre, AVG(sueldo) from empleados group by nombre having AVG(sueldo) > 60000;
La cláusula HAVING actúa como un WHERE, con la diferencia que debe utilizar funciones de agregación.
Ejemplo con distinct
Se puede utilizar la opción distinct para hacer la media de los valores distintos:
select AVG(sueldo), AVG(distinct sueldo) from empleados;
Ejemplo completo
Copia y pega el siguiente código en tu consola de PostgreSQL y realiza paso a paso leyendo los comentarios:
-- Borramos la tabla si existe drop table if exists empleados; -- Creamos la tabla create table empleados ( id_empleado numeric(2,0), id_departamento numeric(2,0), nombre character varying(50), puesto character varying(50), fecha_alta date, sueldo integer ); -- Insertamos valores insert into empleados values (1,1,'Miguel Troyano','Analista','26/09/1986',60000), (2,1,'Ismael Troyano','Analista','01/01/2001',60000), (3,1,'Jose Troyano','Alta Dirección','01/01/2001',80000), (4,1,'Pilar Redondo','Alta Dirección','02/02/2002',80000); -- Mostramos la media del sueldo de la tabla empleados select AVG(sueldo) from empleados; -- Mostramos la media del sueldo de la tabla empleados -- por puesto select puesto, AVG(sueldo) from empleados group by puesto; -- Mostramos el nombre y la media del sueldo -- de la tabla empleados cuando la media del sueldo -- sea mayor de 60000 select nombre, AVG(sueldo) from empleados group by nombre having AVG(sueldo) > 60000; -- Mostramos la media del sueldo -- comparado con la media de los -- sueldos distintos select AVG(sueldo), AVG(distinct sueldo) from empleados;