【问题标题】:How to pivot rows into a single comma separated string如何将行转换为单个逗号分隔的字符串
【发布时间】:2020-11-04 15:44:46
【问题描述】:

重要更新:

当我尝试使用建议的 string_agg 方法时,我收到此错误 - 指定类型 或 Redshift 表不支持的函数(每条 INFO 消息一个)。

原始问题

我有一个查询,但我正在努力将多行“透视”成一列字符串。

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

所以我需要写一个查询来显示每个成员有哪些类别,所以每个成员都有多个类别。当我在 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

【问题讨论】:

  • 请提供样本数据、当前和期望的结果。您不喜欢当前查询的哪些方面?
  • 您在寻找string_agg(c.category, ",")吗?
  • 我已经用你的建议更新了我的问题,我认为它真的有效吗?我还在 string_agg 函数中添加了 distinct - 我认为这是正确的?
  • 当我运行这个时,我得到这个令人担忧的错误 - Redshift 表不支持指定的类型或函数(每个 INFO 消息一个)。我们使用 postgres,但数据被提升到 aws redshift

标签: sql amazon-redshift string-aggregation


【解决方案1】:

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

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

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() 是仅在领导者节点上支持的函数的示例)。

【讨论】:

  • 谢谢!我现在需要离开并了解/了解 postgres 和 redshift 是如何协同工作的——我要掌握的另一件事——它永远不会结束..!
猜你喜欢
  • 2012-02-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 2016-01-29
相关资源
最近更新 更多