PostgreSQL SQL: преобразование результатов в массив

#sql #arrays #postgresql

#sql #массивы #postgresql

Вопрос:

Запрос ниже:

     SELECT  i_adgroup_id, i_category_id
    FROM adgroupcategories_br
    WHERE i_adgroup_id IN
    (
        SELECT i_adgroup_id
        FROM adgroupusers_br
        WHERE i_user_id = 103713
    )
    GROUP BY i_adgroup_id, i_category_id;
  

Дает мне такие результаты:

     i_adgroup_id integer | i_category_id smallint
    ---------------------|-----------------------
    15938                | 2
    15938                | 3
    15938                | 4
    15942                | 1
    15942                | 2
  

Чего я хочу, так это таких результатов:

     i_adgroup_id integer | i_category_id smallint[]
    ---------------------|-----------------------
    15938                | { 2, 3, 4 }
    15942                | { 1, 2 }
  

Как я могу изменить исходный SQL-запрос, чтобы получить приведенный выше результат?

Ответ №1:

Вы хотите использовать array_agg , это должно сработать:

 SELECT i_adgroup_id, array_agg(i_category_id)
FROM adgroupcategories_br
WHERE i_adgroup_id IN
(
    SELECT i_adgroup_id
    FROM adgroupusers_br
    WHERE i_user_id = 103713
)
GROUP BY i_adgroup_id;
  

Обратите внимание, что этого i_category_id больше нет в GROUP BY , поскольку сейчас оно агрегируется.

Комментарии:

1. Спасибо за ваш ответ. Можем ли мы передать несколько столбцов в array_agg или любую другую агрегатную функцию? Я хочу вывести несколько пар ключ: значение в одном и том же выходном столбце с помощью jsonb_object_agg()

2. @Ulvi Вы можете array_agg(array[c1, c2]) создавать массивы из массивов или использовать производные таблицы ( select jsonb_object_agg(k, v) from (select k, array_agg(array[c1, c2]) v from ...) dt ). Или существующие функции JSON могут сделать это без дополнительных шагов. Зависит от того, что конкретно вы пытаетесь создать.