Función MAX en PostgreSQL

La función MAX en PostgreSQL es una de las funciones de agregación más utilizadas, ya que devuelve el valor máximo de un conjunto de valores en una columna o conjunto de datos. Esta función es extremadamente versátil y puede aplicarse a diversos tipos de datos, como números, cadenas, fechas y horas, así como a tipos más específicos como inet, interval, money, oid, pg_lsn, tid y matrices de estos tipos.

Al utilizar MAX, puedes obtener el valor máximo dentro de un conjunto de registros, lo que resulta muy útil para cálculos, análisis y resumen de datos. En consultas con agrupación, esta función ayuda a obtener el valor más alto por cada grupo, proporcionando información relevante sobre los datos.

En este artículo, te explicaré cómo aplicar la función MAX englobada en las denominadas funciones de agregación en diferentes escenarios, optimizando su uso en tus consultas y destacando sus aplicaciones más comunes. Para más información, puedes consultar la documentación oficial de PostgreSQL.

Sintaxis

La sintaxis de la función MAX es la siguiente:

select MAX(expresión)
from tabla

La función MAX no es exclusiva de la cláusula SELECT. También es posible utilizarla en las cláusulas WHERE y HAVING.

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 el mayor sueldo de la tabla empleados:

select MAX(sueldo)
from empleados;
Función MAX en PostgreSQL

Ejemplo agrupando

En este otro ejemplo obtenemos el valor máximo por cada puesto. Observa cómo necesitamos establecer una agrupación usando GROUP BY:

select puesto, MAX(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.

Ejemplo con subconsulta

En este ejemplo utilizamos una subconsulta que nos devuelve el sueldo máximo de la tabla empleados para después mostrar todos los datos de los empleados que tengas dicho sueldo:

select *
from empleados
where sueldo = (select MAX(sueldo) sueldo
				from empleados);

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 el sueldo máximo agrupado por nombre, pero utilizamos la cláusula HAVING para indicar que el máximo sueldo debe ser menos de 80000:

select nombre, MAX(sueldo)
from empleados
group by nombre
having max(sueldo) < 80000;

La cláusula HAVING actúa como un WHERE, con la diferencia que debe utilizar funciones de agregación.

Ejemplo con fechas

Si se utiliza con fechas nos devolverá la máxima fecha como en el siguiente ejemplo:

select MAX(fecha_alta)
from empleados;

Ejemplo con cadenas

Si se utiliza con cadenas nos devolverá la última cadena ordenada alfabéticamente como en el siguiente ejemplo:

select MAX(nombre)
from empleados;

Ejemplo completo

Copia y pega el siguiente código en tu consola de PostgreSQL y realiza paso a paso leyendo los comentarios:

-- www.MiguelTroyano.com
-- 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 el sueldo máximo de la tabla empleados
select MAX(sueldo)
from empleados;

-- Mostramos el sueldo máximo de la tabla empleados
-- por puesto
select puesto, MAX(sueldo)
from empleados
group by puesto;

-- Mostramos todos los datos de la tabla empleados
-- donde el sueldo sea igual al máximo sueldo
select *
from empleados
where sueldo = (select MAX(sueldo) sueldo
				from empleados);

-- Mostramos el nombre y el máximo sueldo
-- de la tabla empleados cuando el sueldo
--máximo sea menor de 80000
select nombre, MAX(sueldo)
from empleados
group by nombre
having max(sueldo) < 80000;

-- Mostramos la fecha más alta
select MAX(fecha_alta)
from empleados;

-- Mostramos el ultimo nombre 
-- ordenado alfabeticamente
select MAX(nombre)
from empleados;

Escribir un comentario