La función MIN en PostgreSQL es una de las funciones de agregación más comunes, utilizada para obtener el valor mínimo de un conjunto de valores no nulos. Esta función puede aplicarse a diversos tipos de datos, incluyendo campos numéricos, cadenas de texto, fechas, horas, enumeraciones y otros tipos como inet, interval, money, oid, pg_lsn, tid y matrices de estos tipos.
Al emplear MIN, puedes identificar rápidamente el valor más bajo dentro de un conjunto de registros, lo cual es útil en muchos escenarios, como encontrar el salario más bajo en una tabla de empleados, la fecha más antigua en una lista de eventos, o el valor más pequeño en cualquier otro conjunto de datos. Además, al utilizarla junto con la cláusula GROUP BY, puedes obtener el valor mínimo por grupos específicos, como encontrar el precio más bajo por categoría de producto.
En este artículo, te guiaré sobre cómo aplicar la función MIN en tus consultas de PostgreSQL para obtener los resultados más precisos y eficientes. Para más información, puedes consultar la documentación oficial de PostgreSQL.
Sintaxis
La sintaxis de la función MIN es la siguiente:
select MIN(expresión) from tabla
La función MIN 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 mínimo sueldo de la tabla empleados:
select MIN(sueldo) from empleados;

Ejemplo agrupando
En este otro ejemplo obtenemos el valor mínimo por cada puesto. Observa cómo necesitamos establecer una agrupación usando GROUP BY:
select puesto, MIN(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ínimo de la tabla empleados para después mostrar todos los datos de los empleados que tengas dicho sueldo:
select * from empleados where sueldo = (select MIN(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, MIN(sueldo) from empleados group by nombre having MIN(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ínima fecha como en el siguiente ejemplo:
select MIN(fecha_alta) from empleados;

Ejemplo con cadena
Si se utiliza con cadenas nos devolverá la primera cadena ordenada alfabéticamente como en el siguiente ejemplo:
select MIN(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ínimo de la tabla empleados select MIN(sueldo) from empleados; -- Mostramos el sueldo mínimo de la tabla empleados -- por puesto select puesto, MIN(sueldo) from empleados group by puesto; -- Mostramos todos los datos de la tabla empleados -- donde el sueldo sea igual al mínimo sueldo select * from empleados where sueldo = (select MIN(sueldo) sueldo from empleados); -- Mostramos el nombre y el mínimo sueldo -- de la tabla empleados cuando el sueldo --minimo sea menor de 80000 select nombre, MIN(sueldo) from empleados group by nombre having MIN(sueldo) < 80000; -- Mostramos la fecha más baja select MIN(fecha_alta) from empleados; -- Mostramos el primer nombre -- ordenado alfabeticamente select MIN(nombre) from empleados;