Функция STRING_AGG() в PostgreSQL: склейка значений группы

STRING_AGG(выражение, разделитель) — агрегатная функция PostgreSQL, которая объединяет значения из всех строк группы в одну строку через заданный разделитель. Аналитик применяет её, чтобы собрать список товаров в заказе, теги в одну ячейку или список email по компании. В MySQL/SQLite аналог — GROUP_CONCAT, в Oracle — LISTAGG.

Синтаксис

STRING_AGG(выражение, разделитель [ORDER BY …])

Примеры использования

Пример 1: Список товаров в каждом заказе

SELECT order_id,
       STRING_AGG(product_name, ', ' ORDER BY product_name) AS products
FROM order_items
GROUP BY order_id;

Результат:

order_id | products
1        | Кофе, Молоко, Сахар
2        | Чай, Печенье

Пример 2: Уникальные каналы по пользователю

SELECT user_id,
       STRING_AGG(DISTINCT channel, ' | ') AS channels
FROM sessions
GROUP BY user_id;

Результат:

user_id | channels
1       | direct | organic
2       | ads
Порешать SQL-задачи в тренажёре →

Типичная ошибка

Порядок склейки без ORDER BY внутри STRING_AGG недетерминирован — если нужен стабильный вывод, добавляй ORDER BY. NULL-значения функция пропускает. Для уникальных значений используй DISTINCT внутри STRING_AGG, но помни, что DISTINCT и ORDER BY по разным выражениям одновременно PostgreSQL не разрешит.

Где спрашивают на собеседовании

STRING_AGG спрашивают в задачах «собери список в одну строку» и при денормализации для витрин/отчётов. На собеседовании назови кросс-СУБД аналоги (GROUP_CONCAT, LISTAGG) — это показывает широту.

FAQ: частые вопросы про STRING_AGG

Чем STRING_AGG отличается от GROUP_CONCAT?

Это одно и то же по смыслу, но STRING_AGG — синтаксис PostgreSQL (значение, разделитель), а GROUP_CONCAT — MySQL/SQLite (разделитель задаётся через SEPARATOR). В Oracle аналог называется LISTAGG.

Как отсортировать значения внутри STRING_AGG?

Добавь ORDER BY прямо в вызов: STRING_AGG(name, ', ' ORDER BY name) — тогда склейка будет в заданном порядке, а не случайной.

Как склеить только уникальные значения?

Используй STRING_AGG(DISTINCT выражение, разделитель). Дубликаты будут убраны до склейки.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы SQL

Агрегации

Другие функции SQL

COUNT · SUM OVER · ROUND · UPPER / LOWER · LENGTH · AVG

Открыть SQL-тренажёр (565 задач) →