【问题标题】:How to GROUP BY and CONCATENATE fields in redshift如何在 redshift 中对字段进行 GROUP BY 和 CONCATENATE
【发布时间】:2014-08-21 12:45:59
【问题描述】:

如何在 redshift 中进行 GROUP BY 和 CONCATENATE 字段,例如 如果我有桌子

ID   COMPANY_ID   EMPLOYEE
1    1            Anna
2    1            Bill
3    2            Carol
4    2            Dave

我怎样才能得到这样的结果

COMPANY_ID   EMPLOYEE
1            Anna, Bill
2            Carol, Dave

There some solutions PostgreSQL,但答案中提到的所有功能都没有在 Redshift 中可用。

【问题讨论】:

标签: sql postgresql group-by string-concatenation amazon-redshift


【解决方案1】:

== rohitkulky 回答说,Redshift 现在支持这个,不要使用这个 hack ==

看起来没有直接的方法可以解决这个问题。这是我为解决它所做的,此解决方案仅在您知道按字段分组重复多少次时才有效,例如在上述情况下为 2,因为 company_id 被重复两次。就我而言,我知道这个计数,所以这个解决方案对我有用,虽然不是很优雅

如果按计数分组为 2

select e1.company_id, e1.name || e2.name
from employee e1, employee e2
where e1.company_id = e2.company_id and e1.id < e2.id;

如果按计数分组为 3

select e1.company_id, e1.name || e2.name || e3.name
from employee e1, employee e2, employee e3
where e1.company_id = e2.company_id and e1.company_id = e2.company_id and e1.id < e2.id and e2.id < e3.id;

【讨论】:

  • 如果每个结果行有不同的连接数,这将如何工作?
  • OMG,不要使用这个解决方案,它不支持多行和结果
【解决方案2】:

好吧,我有点晚了,但announcement about this feature 发生在 2015 年 8 月 3 日。 Redshift 引入了 LISTAGG 窗口函数,现在可以做到这一点。 这是您的问题的快速解决方案 - 可能有用也可能没有用,但将其放在这里以便人们知道!

SELECT COMPANY_ID,
       LISTAGG(EMPLOYEE,', ')
WITHIN GROUP (ORDER BY EMPLOYEE)
OVER (PARTITION BY COMPANY_ID) AS EMPLOYEE
FROM YOUR_TABLE
ORDER BY COMPANY_ID

我很高兴看到此功能,并且我们的许多生产脚本都已升级为 Redshift 不断添加的所有新功能。

Here is the documentation about the function

【讨论】:

  • 这是 Redshift 支持 LISTAGG 的最佳答案。
猜你喜欢
  • 2017-09-12
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多