#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
, где вы можете указывать заказы.