Redshift 实现数组多值关联与LISTAGG聚合拼接的正确方法
报错核心原因
该报错是Redshift内置的函数使用规则导致:
LISTAGG、MEDIAN、PERCENTILE_CONT这类聚合函数属于用户表专属函数,不允许直接作用在Redshift内置的系统元数据表(即查询中引用的pg_group,这类pg开头的对象是系统存储集群元信息的内置表/视图,并非用户自建的业务表)上。- 原语句直接将系统表作为
LISTAGG的输入源,自然会触发函数使用范围校验报错。
正确实现方案
核心逻辑是先将系统表的数据抽取为当前会话的临时表——临时表属于用户创建的会话级对象,完全满足上述聚合函数的使用前提,后续再执行关联聚合即可。
- 抽取系统表元数据生成临时表
CREATE TEMP TABLE tmp_pg_group AS SELECT group_id, group_name, userid FROM pg_group; - 基于临时表执行关联聚合,输出目标结果
SELECT g.group_id, g.group_name, LISTAGG(u.username, ',') WITHIN GROUP (ORDER BY u.username) AS username FROM tmp_pg_group g LEFT JOIN pg_user u ON u.userid = ANY(g.userid) GROUP BY g.group_id, g.group_name;
优化说明
- 原语句仅按
group_name分组,若存在重名分组会导致结果错位,将group_id加入分组维度可保证结果准确性。 - 补充
WITHIN GROUP排序子句,可固定拼接后username的顺序,避免多次执行结果不一致。
内容的提问来源于stack exchange,提问作者TheDataGuy
相关产品推荐
相关产品推荐

