字符串_agg函数中的Postgresql限制

字符串_agg函数中的Postgresql限制,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,我的问题如下: SELECT string_agg(sn::text, ','), product_id FROM irmsapp_serializedinventory group by product_id; 结果是一个聚合的sno字段和产品。我想知道我们是否可以将连接限制为5,而将其余的留给sno字段。当前,我的sno字段是一个大列表,我想将其缩减为5个元素的列表排序顺序中的前5个元素。关系数据库中的行未排序。您需要有一些列,您可以根据这些列对结果进行排序,只有这样您才能指定哪些

我的问题如下:

SELECT string_agg(sn::text, ','), product_id
  FROM irmsapp_serializedinventory
  group by product_id;

结果是一个聚合的sno字段和产品。我想知道我们是否可以将连接限制为5,而将其余的留给sno字段。当前,我的sno字段是一个大列表,我想将其缩减为5个元素的列表排序顺序中的前5个元素。

关系数据库中的行未排序。您需要有一些列,您可以根据这些列对结果进行排序,只有这样您才能指定哪些行是前五行

假设您有一个定义前五个的列,例如创建的_at列,您可以执行以下操作:

select string_agg(sno::text, ','), product_id
from (
   select product_Id, sno,
          row_number() over (partition by product_id order by created_at desc) as rn
   from irmsapp_serializedinventory
) t
where rn <= 5
group by product_id;
这将为每个产品选择5行。如果您只需要5行,而不考虑产品标识,那么只需在窗口函数中删除按产品标识划分的分区即可


在desc创建的顺序定义了排序顺序,定义了聚合中使用的五行。

前五个元素我希望它们按排序顺序排列。嗨,我有个问题。如果我的行已经排序了,我需要得到前5行怎么办?@RogerFederer:再说一遍:关系数据库中的行没有排序。唯一真正有效的方法:保证排序顺序的唯一方法是使用订单,因为别无选择。