Как группировать поля 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 продолжает добавлять.
Вот документация о функции