Tema SQL
array_agg() (PostgreSQL)
Agregado que acumula valores en un array SQL nativo (no en una cadena). Distinto de STRING_AGG (texto) y de listas en otros motores; permite orden interno y filtrar NULL.
Descripción
array_agg(expresión [ORDER BY …]) dentro de GROUP BY produce un array con un elemento por fila del grupo. ARRAY_AGG(DISTINCT …) elimina duplicados antes de agregar (según versión y tipo). El resultado es tipo array real: puedes indexar, pasar a unnest o usar operadores @>, &&, etc. STRING_AGG concatena texto; si necesitas JSON, valora json_agg o jsonb_agg. En MySQL los arrays no son tipo de primera clase; en SQL Server se usan XML/JSON o tablas. ORDER BY dentro del agregado define el orden de los elementos en el array.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
array_agg(expresión [ORDER BY ...]) [FILTER (WHERE ...)]
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- FILTER
- Excluye filas del agregado sin quitarlas del GROUP BY exterior cuando se combina bien.
- NULL
- Suelen incluirse como elementos NULL salvo que uses FILTER o COALESCE.
- STRING_AGG
- Elige texto legible; array_agg para tipado fuerte y operadores de array.
Ejemplos
Ejemplo 1
SELECT depto_id, array_agg(nombre ORDER BY apellido)
FROM empleados
GROUP BY depto_id;
SELECT array_agg(DISTINCT etiqueta) AS tags
FROM articulo_etiquetas
WHERE articulo_id = 42;
Ejemplo 2
SELECT pedido_id,
array_agg(linea_id ORDER BY linea_id) AS lineas
FROM lineas_pedido
GROUP BY pedido_id;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.