Агрегатністандарт SQL

ARRAY_AGG

Збирає значення з багатьох рядків в один масив.

Синтаксис

ARRAY_AGG(<вираз>)
ARRAY_AGG(<вираз> ORDER BY <критерій>)

Агрегатна функція, як STRING_AGG, але результат — не текст, а масив: з ним можна працювати далі, як зі списком. Порядок елементів задають через ORDER BY просто в дужках, а окремий елемент дістають за номером: [1] — перший.

Дані для прикладів

employees

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

Ці таблиці вже створено в пісочниці — приклади нижче працюють із ними. Хочеш повторити у своїй базі — скопіюй SQL.

Усі імена в масив
SELECT ARRAY_AGG(name) AS names
FROM employees;
names
["Emma","Liam","Olivia","Noah","Sophia"]

Таблиця результату показує масив у квадратних дужках, а сам PostgreSQL, наприклад у psql, пише його так: {Emma,Liam,…}.

Масив для кожного відділу
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"]
Хто заробляє найбільше у відділі — без підзапитуСкладніше
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

Збираємо імена від найбільшої зарплати до найменшої й беремо перший елемент.

Зверни увагу

NULL не пропускаються, а потрапляють у масив. Прибрати їх — ARRAY_AGG(phone) FILTER (WHERE phone IS NOT NULL).

Нумерація елементів починається з 1, а не з 0: (ARRAY_AGG(name))[0] дасть NULL.

Потрібен просто текст через кому — бери STRING_AGG. Масив зручний для подальшої обробки, а не для показу.

Схожі функції