2010-09-13 79 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 
相关问题