PostgreSQL - string_agg,元素数量有限

7fhtutme  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(5)|浏览(217)

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

string_agg(distinct(tag),', ')
uqzxnwby

uqzxnwby1#

还有两个办法
1.从行中创建一个数组,限制它,然后连接成字符串:

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

(“array[1:3]”表示:从数组中取1到3的项)
1.将行无限制地连接成字符串,然后使用“substring”来修剪它:

string_agg(distinct(tag),',')

如果你知道你的“标签”字段不能包含,字符,那么你可以选择第n次出现,之前的所有文本

SELECT substring(
string_agg(DISTINCT tag, ',') || ','
from '(?:[^,]+,){1,3}')
FROM tbl

这个子字符串将选择3个或更少的字符串除以,。要排除尾随的,,只需添加rtrim

SELECT rtrim(substring(
string_agg(DISTINCT tag, ',') || ','
from '(?:[^,]+,){1,3}'), ',')
FROM test
nzrxty8p

nzrxty8p2#

“限制以下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比在子查询中一次对所有行执行它更昂贵。
或者,获取 “100个最常见的标签”

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

mwngjboj3#

我不知道你可以在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
rt4zxlrg

rt4zxlrg4#

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

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

kq4fsx7k5#

使用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;

相关问题