限制array_agg的结果数量

时间:2017-05-10 01:43:03

标签: sql json postgresql aggregate-functions

我在努力限制array_agg()返回的结果数量。这是我到目前为止的查询:

SELECT s.*,
(
  SELECT array_agg(row_to_json(smr.*))
  AS "monthRatings"
)
FROM services s
INNER JOIN servicemonthratings smr ON s._id = smr.service_id
GROUP BY s._id

是否有更好的方法可以完成与上述相同的事情?

2 个答案:

答案 0 :(得分:0)

这没有任何意义,你显然很困惑。

  1. 您不使用array_agg来聚合json。你使用json_agg。
  2. 如果你打算像这样使用array_agg(),你也可以使用数组构造函数ARRAY()
  3. 如果您打算使用array_agg,则应将其滚动到外部并将其从数组列表中删除。
  4. 提供一些样本数据和您想要的输出。

答案 1 :(得分:0)

简单:

SELECT s.*, array_agg(row_to_json(smr)) AS "monthRatings"
FROM   services s
JOIN   servicemonthratings smr ON s._id = smr.service_id
GROUP  BY s._id;
  • 无需选择子选项。
  • 您可以使用表格别名smr(表示行类型)而不是smr.*,此处的结果相同。
  • services ._id必须是PK,否则查询是无意义的。

我怀疑你真的想要一个JSON数组行,你不想要消除没有评级的服务(

SELECT s.*, smr."monthRatings"
FROM   services s, LATERAL (
   SELECT json_agg(smr) AS "monthRatings"
   FROM   servicemonthratings
   WHERE  service_id = s._id
   ) smr;

现在您不需要汇总services_id也不一定是PK。

由于LATERAL子查询总是返回一行(由于其中包含聚合函数),因此不会消除任何服务。