web-dev-qa-db-ja.com

redshiftでフィールドをGROUP BYおよびCONCATENATEする方法

RedshiftのフィールドをGROUPBYおよび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

PostgreSQLのソリューションもあります ですが、回答に記載されている関数はRedshiftで使用できません。

20
spats

さて、私は少し遅れていますが、 この機能に関する発表 は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が追加し続けるすべての新機能を備えた多くのプロダクションスクリプトがアップグレードの準備ができています。

これは関数に関するドキュメントです

24
rohitkulky

これを解決する簡単な方法はないようです。これが私がそれを解決するためにしたことです。この解決策は、フィールドごとのグループが何回繰り返されるかを知っている場合にのみ機能します。たとえば、上記の場合は2で、company_idが2回繰り返されます。私の場合、私はこの数を知っているので、このソリューションは私にとってはうまくいきますが、あまりエレガントではありません

カウントによるグループ化が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;
0
spats