Как группировать поля BY и CONCATENATE в 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

Там есть некоторые решения PostgreSQL, но ни одна из функций, упомянутых в ответах, не доступна в Redshift righnow.

Ответ 1

Похоже, нет прямого способа решить эту проблему. Вот что я сделал для ее решения, это решение работает только тогда, когда u знает, сколько раз повторяется команда ur по полю, например, в приведенном выше случае его 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;

Ответ 2

Ну, я немного опоздал, но объявление об этой функции произошло 3 августа 2015 года. 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 продолжает добавлять.

Вот документация о функции