Как взять данные из строк и поместить их в одно поле?

#sql #postgresql #group-by

#sql #postgresql #группировать по

Вопрос:

У меня есть следующая база данных:

 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
  

Ответ №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

Комментарии:

1. Можете ли вы объяснить разницу между string_agg(name, ' ') и concat(name) ?

Ответ №2:

concat(x,y) склеивает два скалярных значения (например, два значения столбца в одной строке). string_agg(name, sep) склеивает значения столбца name в пределах одной группы агрегирования. Поскольку нет гарантии упорядочения внутри этой группы, будьте внимательны; и проверьте агрегированные данные уровня SQL-2003, например PARTITION , где вы можете указывать заказы.