2010-09-13 112 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 – 2010-09-13 19:45:48

回答

13

使用GROUP_CONCAT aggregate function

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

默認分隔符是一個逗號(「,」),因此您需要指定單個空間的SEPARATOR以獲取你想要的輸出。

如果你想確保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 2010-09-13 20:47:28

+0

@haoxu:下一個選項(來自SQL預測)將是一個遊標和字符串連接,但它需要一個MySQL函數。我對Hive並不熟悉 - 有沒有使用本地查詢的方法? – 2010-09-13 21:11:46

+1

在HiveQL中提交了GROUP_CONCAT的JIRA請求:https://issues.apache.org/jira/browse/HIVE-1689 – 2010-10-04 11:25:14

-6

我敢肯定,你不能使用蜂巢QL做到這一點。但是,如果您編寫自己的Map/Reduce腳本,則應該可以這樣做 - 請參閱this tutorial以開始。

+0

答案已過時。較新的版本具有這些功能。 – 2016-07-08 11:07:07

41

在蜂巢可以使用

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

collect_set刪除重複。如果你需要讓他們可以檢查這個帖子:

COLLECT_SET() in Hive, keep duplicates?

+1

正是我想要的!就像一種魅力,通過查詢將一行排成一行 – 2012-07-16 20:19:53

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