2010-09-13 2 views
12

Поэтому у меня есть 5 строк, как этотОбъединение нескольких строк в один разделенный пробелами строки

userid, col 
-------------- 
1, a 
1, b 
2, c 
2, d 
3, e 

Как бы сделать запрос таким образом это будет выглядеть следующим образом

userid, combined 
1, a b 
2, c d 
3, e 
+0

Почти точный дубликат: http://stackoverflow.com/questions/2885709/sql-concatenate-rows-query –

ответ

13

Используйте GROUP_CONCAT aggregate function:

SELECT yt.userid, 
     GROUP_CONCAT(yt.col SEPARATOR ' ') AS combined 
    FROM YOUR_TABLE yt 
GROUP BY yt.userid 

Разделитель по умолчанию - это запятая (","), поэтому вам нужно указать СЕПАРАТОР одного места, чтобы получить желаемый результат.

Если вы хотите, чтобы обеспечить порядок значений в GROUP_CONCAT, используйте:

SELECT yt.userid, 
     GROUP_CONCAT(yt.col ORDER BY yt.col SEPARATOR ' ') AS combined 
    FROM YOUR_TABLE yt 
GROUP BY yt.userid 
+0

Я нахожусь в настоящее время использую Hive, поэтому я не могу сделать группу по отдельности, потому что GROUP_CONCAT не распознается как функция агрегации, так или иначе? – haoxu

+0

@haoxu: Следующий вариант (из SQL-предположения) был бы курсором и конкатенацией строк, но для этого потребовалась бы функция MySQL. Я не знаком с Hive - нет ли способа использования собственного запроса? –

+1

Подал запрос JIRA для GROUP_CONCAT в HiveQL: https://issues.apache.org/jira/browse/HIVE-1689 –

-6

Я уверен, что вы не можете сделать это с помощью улей QL. Однако это должно быть возможно, если вы напишете свои собственные сценарии Map/Reduce - см. this tutorial, чтобы начать.

+0

Ответ устарел. В новых версиях есть функции. –

41

В улье можно использовать

SELECT userid, collect_set(combined) FROM tabel GROUP BY user_id; 

collect_set удаляет дублированные. Если вам нужно, чтобы держать их, вы можете проверить этот пост:

COLLECT_SET() in Hive, keep duplicates?

+1

именно то, что я хотел! работает как шарм, чтобы конкатрировать строку из группы по запросу –

2
SELECT 
    userid, 
    concat_ws(" ", collect_set(col)) AS combined 
FROM table 
GROUP BY userid