【问题标题】:How to take data from rows and put it into single field?如何从行中获取数据并将其放入单个字段?
【发布时间】:2014-07-03 00:11:06
【问题描述】:

我有以下数据库:

paperid  | authorid |       name       |                                   affiliation                                   
---------+----------+------------------+---------------------------------------------------------------------------------
  487792 |  1487835 | Mark A. Magnuson | Vanderbilt University
  487792 |  1814994 | Miriam Magnuson  | Department of Education and Psychology, Linköping University, Linköping, Sweden
  487792 |  2248713 | Leif Hergils     | Department of Audiology, University Hospital, Linköping, Sweden

我想用它做这样的东西:

paperid  |                 name                                    |
---------+---------------------------------------------------------+
  487792 | Mark A. Magnuson Miriam Magnuson Leif Hergils

将所有作者的姓名放在一个列/字段中。

如何使用 SQL 做到这一点?

编辑

我试过了:

select paperid, concat(name) as authors FROM newpaperauthor GROUP BY paperid, name ORDER BY paperid;

但这会单独列出作者:

 paperid |          authors           
---------+----------------------------
  896450 | Bart Dhoedt
  896450 | Marc De Leenheer

【问题讨论】:

    标签: sql postgresql group-by


    【解决方案1】:
    select paperid, string_agg(name, ' ') as authors 
    FROM newpaperauthor 
    GROUP BY paperid 
    ORDER BY paperid;
    

    string_agg 通过聚合一列进行字符串连接:

    http://www.postgresql.org/docs/current/static/functions-aggregate.html#FUNCTIONS-AGGREGATE-TABLE

    concat 对提供的参数进行字符串连接:

    http://www.postgresql.org/docs/current/static/functions-string.html#FUNCTIONS-STRING-OTHER

    【讨论】:

    • 你能解释一下string_agg(name, ' ')concat(name)之间的区别吗?
    【解决方案2】:

    concat(x,y) 将两个标量值粘合在一起(例如,同一行中的两个列值)。 string_agg(name, sep) 在一个聚合组中将列name 的值粘合在一起。由于不能保证在该组内订购,请注意购买者;并查看 SQL-2003 级别的聚合,例如 PARTITION,您可以在其中指定订单。

    【讨论】:

      猜你喜欢
      • 2018-08-30
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2019-06-20
      • 1970-01-01
      相关资源
      最近更新 更多