Función ANY_VALUES en PostgreSQL

La función ANY_VALUES en PostgreSQL es una herramienta poderosa que permite incluir un campo no agregable, como texto o cualquier otro tipo no numérico, en el resultado de una consulta sin necesidad de añadirlo a la cláusula GROUP BY. Esto es especialmente útil en consultas que manejan grandes volúmenes de datos, ya que simplifica el agrupamiento y puede reducir significativamente el tiempo de ejecución.

Como parte del conjunto de funciones de agregación en PostgreSQL, ANY_VALUES devuelve un valor arbitrario de los datos agrupados. Es una solución eficiente para escenarios donde no se necesita un cálculo específico sobre el campo no agregable, pero sí deseas incluirlo en el resultado para referencias o contextos adicionales.

En este artículo, exploraremos cómo utilizar la función ANY_VALUES en tus consultas, revisaremos ejemplos prácticos de sus aplicaciones más frecuentes y explicaremos cómo puede optimizar la manipulación de datos en bases de datos grandes y complejas.

Para más información, puedes consultar la documentación oficial de la función ANY_VALUES en PostgreSQL.

Sintaxis

La sintaxis para utilizar la función ANY_VALUES en PostgreSQL es la siguiente:

select any_value ( anyelement ) 
from tabla;

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 sin incluir el puesto en el group by:

SELECT nombre, any_value(puesto), sum(sueldo)
from empleados
group by nombre;

Ejemplo completo

Copia y pega el siguiente código en tu consola de PostgreSQL y realiza paso a paso leyendo los comentarios para comprender la función ANY_VALUES en PostgreSQL:

-- 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 por nombre y puesto
SELECT nombre, any_value(puesto), sum(sueldo)
from empleados
group by nombre;

Escribir un comentario