De agregaciónestándar SQL

ARRAY_AGG

Reúne valores de muchas filas en un solo array.

Sintaxis

ARRAY_AGG(<expresión>)
ARRAY_AGG(<expresión> ORDER BY <criterio de orden>)

Una función de agregación como STRING_AGG, pero el resultado es un array y no un texto: puedes seguir trabajando con él como con una lista. El orden de los elementos se indica con ORDER BY dentro de los propios paréntesis, y un elemento concreto se toma por su número: [1] es el primero.

Datos para los ejemplos

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Estas tablas ya están creadas en el entorno de pruebas y los ejemplos de abajo las usan. ¿Quieres repetirlo en tu propia base de datos? Copia el SQL.

Todos los nombres en un array
SELECT ARRAY_AGG(name) AS names
FROM employees;
names
["Emma","Liam","Olivia","Noah","Sophia"]

La tabla de resultados muestra el array entre corchetes, pero el propio PostgreSQL, en psql por ejemplo, lo escribe así: {Emma,Liam,…}.

Un array para cada departamento
SELECT department,
ARRAY_AGG(name ORDER BY name) AS team
FROM employees
GROUP BY department
ORDER BY department;
departmentteam
backend["Emma","Liam"]
design["Sophia"]
frontend["Noah","Olivia"]
Quién gana más en cada departamento, sin subconsultaAvanzado
SELECT department,
(ARRAY_AGG(name ORDER BY salary DESC))[1] AS top_earner
FROM employees
GROUP BY department
ORDER BY department;
departmenttop_earner
backendEmma
designSophia
frontendOlivia

Reunimos los nombres del salario más alto al más bajo y tomamos el primer elemento.

Ten en cuenta

Los NULL no se saltan, sino que entran en el array. Para quitarlos: ARRAY_AGG(phone) FILTER (WHERE phone IS NOT NULL).

La numeración de los elementos empieza en 1, no en 0: (ARRAY_AGG(name))[0] da NULL.

Si solo necesitas un texto separado por comas, usa STRING_AGG. Un array es cómodo para seguir procesando, no para mostrar.

Funciones relacionadas