【问题标题】:Combine multiple rows into one space separated string将多行合并为一个空格分隔的字符串
【发布时间】:2011-04-11 20:24:42
【问题描述】:

所以我有 5 行这样的

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

我将如何进行查询,使其看起来像这样

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

【问题讨论】:

标签: sql mysql hive


【解决方案1】:
  1. MySQL 重复:select col1, group_concat(col2) from table1 group by col1
  2. MySQL 没有重复:select col1, group_concat(distinct col2) from table1 group by col1
  3. Hive 重复:select col1, collect_list(col2) from table1 group by col1
  4. Hive 没有重复:select col1, collect_set(col2) from table1 group by col1

【讨论】:

    【解决方案2】:
    SELECT 
      userid,
      concat_ws(" ", collect_set(col)) AS combined
    FROM table 
    GROUP BY userid
    

    【讨论】:

      【解决方案3】:

      在蜂巢中你可以使用

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

      collect_set 删除重复的。如果您需要保留它们,可以查看此帖子:

      COLLECT_SET() in Hive, keep duplicates?

      【讨论】:

      • 正是我想要的!通过查询从组中连接一行就像一种魅力
      【解决方案4】:

      使用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
      

      【讨论】:

      • 我目前正在使用 Hive,所以我不能按部分进行分组,因为 GROUP_CONCAT 不被识别为聚合函数,不管怎样?
      • @haoxu:下一个选项(从 SQL 角度来看)将是游标和字符串连接,但它需要 MySQL 函数。我不熟悉 Hive - 有没有办法使用原生查询?
      • 在 HiveQL 中为 GROUP_CONCAT 提交了 JIRA 请求:issues.apache.org/jira/browse/HIVE-1689
      • GROUP_CONCAT 实际上并不存在于 Hive 中...此解决方案仅适用于 MySQL。
      • 您好,我在 sql lite sqliteonline.com GROUP_CONCAT 上进行了相同的测试
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 2019-10-17
      • 1970-01-01
      相关资源
      最近更新 更多