PostgreSQL SQL:将结果转换为数组

54

以下查询:

    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个回答

82

你想要使用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()在同一输出列中输出多个键值对。 - Ulvi
1
@Ulvi 你可以使用array_agg(array[c1, c2])来构建数组的数组,或者使用派生表(select jsonb_object_agg(k, v) from (select k, array_agg(array[c1, c2]) v from ...) dt)。或者现有的JSON函数可能会在不需要额外步骤的情况下完成它。具体取决于你想要生成什么。 - mu is too short

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接