#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 могут сделать это без дополнительных шагов. Зависит от того, что конкретно вы пытаетесь создать.