我正在寻找一种方法,通过查询连接组内字段的字符串。例如,我有一个表格:

ID   COMPANY_ID   EMPLOYEE
1    1            Anna
2    1            Bill
3    2            Carol
4    2            Dave

我想通过company_id进行分组,以获得如下内容:

COMPANY_ID   EMPLOYEE
1            Anna, Bill
2            Carol, Dave

mySQL中有一个内置函数来执行这个group_concat


当前回答

根据PostgreSQL 9.0及以上版本,你可以使用名为string_agg的聚合函数。你的新SQL应该看起来像这样:

SELECT company_id, string_agg(employee, ', ')
    FROM mytable GROUP BY company_id;

其他回答

这个答案不是我的功劳,因为我是经过一番搜索才找到的:

我不知道的是PostgreSQL允许你用CREATE aggregate定义你自己的聚合函数

PostgreSQL列表上的这篇文章展示了创建一个函数来做所需的事情是多么简单:

CREATE AGGREGATE textcat_all(
  basetype    = text,
  sfunc       = textcat,
  stype       = text,
  initcond    = ''
);

SELECT company_id, textcat_all(employee || ', ')
FROM mytable
GROUP BY company_id;

下面是关于字符串连接的自定义聚合函数的使用:你需要记住,select语句将以任意顺序排列行,所以你需要在from语句中使用order by子句执行子选择,然后使用group by子句执行外层选择来聚合字符串,这样:

SELECT custom_aggregate(MY.special_strings)
FROM (SELECT special_strings, grouping_column 
        FROM a_table 
        ORDER BY ordering_column) MY
GROUP BY MY.grouping_column

使用STRING_AGG函数PostgreSQL和谷歌BigQuery SQL:

SELECT company_id, STRING_AGG(employee, ', ')
FROM employees
GROUP BY company_id;

使用Postgres文档继续Kev的回答:

首先,创建一个元素数组,然后使用内置的array_to_string函数。

CREATE AGGREGATE array_accum (anyelement)
(
 sfunc = array_append,
 stype = anyarray,
 initcond = '{}'
);

select array_to_string(array_accum(name),'|') from table group by id;

从PostgreSQL 9.0开始,你可以使用名为string_agg的聚合函数。你的新SQL应该看起来像这样:SELECT company_id, string_agg(employee, ', ') 从mytable GROUP BY company_id;