PostgreSQL - string_agg,元素数量有限

时间:2014-12-10 15:46:34

标签: sql postgresql aggregate-functions

是否可以限制以下string_agg功能中的元素数量?

 string_agg(distinct(tag),', ')

5 个答案:

答案 0 :(得分:7)

我不知道您可以在string_agg()函数中限制它。您可以通过其他方式限制它:

select postid, string_agg(distinct(tag), ', ')
from table t
group by postid

然后你可以这样做:

select postid, string_agg(distinct (case when seqnum <= 10 then tag end), ', ')
from (select t.*, dense_rank() over (partition by postid order by tag) as seqnum
      from table t
     ) t
group by postid

答案 1 :(得分:7)

limit the number of elements in the following string_agg(),请在子查询中使用LIMIT

SELECT string_agg(tag, ', ') AS tags
FROM  (
   SELECT DISTINCT tag
   FROM   tbl
   -- ORDER  BY tag -- optionally order to get deterministic result
   LIMIT   123     -- add your limit here
   ) sub;

请注意,子查询根本不是性能问题。 相反,即使您没有使用LIMIT强加最大数量,这通常会更快,因为分组DISTINCT在聚合函数中,比在一个子查询中同时对所有行执行它更加昂贵。

或者,获取&#34; 100个最常见的标签&#34;:

SELECT string_agg(tag, ', ') AS tags
FROM  (
   SELECT tag
   FROM   tbl
   GROUP  BY tag
   ORDER  BY count(*) DESC
   LIMIT  100
   ) sub;

答案 2 :(得分:5)

还有两种方式。

1)从行创建一个数组,限制它,然后连接成字符串:

SELECT array_to_string((array_agg(DISTINCT tag))[1:3], ', ') FROM tbl

(&#34;数组[1:3]&#34;表示:从数组中取出1到3的项目)

2)无限制地将行连接成字符串,然后使用&#34; substring&#34;修剪它:

string_agg(distinct(tag),',')

如果你知道你的&#34;标签&#34;字段不能包含,字符,那么您可以在,

第n次出现之前选择所有文字
SELECT substring(
string_agg(DISTINCT tag, ',')
from '(?:[^,]+,){1,3}')
FROM tbl

此子字符串将选择3个或更少的字符串除以,

答案 3 :(得分:1)

string_agg子句嵌套在split_part中,包括定界符作为第二个参数,以及所需元素的数量作为最后一个参数。像这样:

split_part(string_agg(distinct(tag),', '), ', ', 1)

答案 4 :(得分:0)

使用IN进行过滤

赞!

Select
  primaryID,
  String_Agg(email, '|') As Email
From
  contacts
Where
  contactID In (Select filter.contactID
  From contacts filter
  Where filter.primaryID = contacts.primaryID
  Order By filter.contactID)
Group By
  primaryID;