如何将行转换为单个逗号分隔的字符串

How to pivot rows into a single comma separated string

重要更新:

When I try to use the suggested string_agg method I get this error - Specified types or functions (one per INFO message) not supported on Redshift tables.

原题

我有一个查询,但我正在努力将多行“转换”为一列字符串。

我有一个 member 和一个 category table 并且每个成员可以有多个类别(这是对场景的简化)。

所以我需要写一个查询来显示每个成员有哪些类别,所以每个成员都有多个类别。当我在 Microsoft 世界工作时,我能够使用 pivot 但现在在 Postgres 中我找不到等效的方法。

我已经看到对交叉表和其他一些方法的引用,但是在尝试时我收到错误消息,提示无法识别该函数。

我的尝试!

select                              
    m.member_id,                                
    array.join(c.category, ",") -- this is more like a programming approach but I need something similar to this
from member m
from join category c ON c.member_id = m.id
group by 1      

数据集示例

https://dbfiddle.uk/?rdbms=postgres_13&fiddle=8ea4998f75f7db83d2360ff01bf02c82

我使用 Navicat Premium 作为我的“编辑器”

第二次尝试

select b.member_id, string_agg(distinct c.name, ',') 
from bookings b 
join category c on c.member_id = b.member_id 
group by 1

Redshift 不支持 string_agg() 函数,但具有我认为等效的 listagg() 函数。参见:https://docs.aws.amazon.com/redshift/latest/dg/r_LISTAGG.html

Listagg() 支持 DISTINCT,甚至具有 window 函数形式。这不会产生您想要的结果吗?

select b.member_id, listagg(distinct c.name, ',') 
from bookings b 
join category c on c.member_id = b.member_id 
group by 1;

至于更新中的错误消息,这是 Redshift 的神秘方式,表示您已尝试在计算节点(或类似的东西)上执行仅领导节点操作。我不明白为什么你会得到它,除非支持 string_agg() 作为仅领导者操作(generate_series() 是仅在领导者节点上支持的函数示例)。