Sql postgres STRING_AGG()返回重复项?

Sql postgres STRING_AGG()返回重复项?,sql,postgresql,join,group-by,average,Sql,Postgresql,Join,Group By,Average,我看到过一些类似的帖子,要求提供建议,以便从查询中获得不同的结果。这可以通过子查询解决,但是我正在聚合的列image\u name是唯一的image\u name VARCHAR(40)NOT NULL unique。我不认为那是必要的 这是spot_图像表中的数据 spotdk=# select * from spot_images; id | user_id | spot_id | image_name ----+---------+-

我看到过一些类似的帖子,要求提供建议,以便从查询中获得不同的结果。这可以通过子查询解决,但是我正在聚合的列
image\u name
是唯一的
image\u name VARCHAR(40)NOT NULL unique
。我不认为那是必要的

这是spot_图像表中的数据

spotdk=# select * from spot_images;
 id | user_id | spot_id |              image_name              
----+---------+---------+--------------------------------------
  1 |       1 |       1 | 81198013-e8f8-4baa-aece-6fbda15a0498
  2 |       1 |       1 | 21b78e4e-f2e4-4d66-961f-83e5c28d69c5
  3 |       1 |       1 | 59834585-8c49-4cdf-95e4-38c437acb3c1
  4 |       1 |       1 | 0a42c962-2445-4b3b-97a6-325d344fda4a
(4 rows)
选择四舍五入(平均评级),2)作为评级,
斑点。*,
字符串_agg(spot_images.image_name,,')作为图像名称
从斑点
完全外部联接额定值
ON ratings.spot_id=spots.id
内连接点图像
ON spot_images.spot_id=spots.id
其中,spots.id=1
按spots.id分组;
这是图像行的结果:

81198013-e8f8-4baa-aece-6fbda15a0498,
21b78e4e-f2e4-4d66-961f-83e5c28d69c5,
59834585-8c49-4cdf-95e4-38c437acb3c1,
0a42c962-2445-4b3b-97a6-325d344fda4a,
81198013-e8f8-4baa-aece-6fbda15a0498,
21b78e4e-f2e4-4d66-961f-83e5c28d69c5,
59834585-8c49-4cdf-95e4-38c437acb3c1,
0a42c962-2445-4b3b-97a6-325d344fda4a,
81198013-e8f8-4baa-aece-6fbda15a0498,
21b78e4e-f2e4-4d66-961f-83e5c28d69c5,
59834585-8c49-4cdf-95e4-38c437acb3c1,
0a42c962-2445-4b3b-97a6-325d344fda4a
不是使用换行符,我添加它们是为了可见性


我应该怎么做才能每次检索一次图像名称

如果您不想重复,请使用
DISTINCT

   String_agg(distinct spot_images.image_name, ',') AS imageNames

很可能,
评级
中有几行与给定的
spot
匹配,而
spot_图像
中也有几行与给定的
sport
匹配。结果,行被复制了

避免这种情况的一个选项是在子查询中聚合:

SELECT r.avg_raging
       s.*, 
       si.image_names
FROM   spots s
       FULL OUTER JOIN (
           SELECT spot_id, Round(Avg(ratings.rating), 2) avg_rating
           FROM ratings
           GROUP BY spot_id
       ) r ON r.spot_id = s.id
       INNER JOIN (
           SELECT spot_id, string_agg(spot_images.image_name, ',') image_names
           FROM spot_images
           GROUP BY spot_id
       ) si ON si.spot_id = s.id 
WHERE  s.id = 1 
这实际上可能比外部聚合更有效


注意:看不到您的数据很难判断,但我不确定您是否真的需要这里的
完全加入。
左连接实际上可能就是您想要的。

这很快很容易-为什么需要这样做?为什么只有4条记录的时候,它会累积超过11条记录?@JonasGrønbek。聚合函数聚合整个集合,包括重复值。如果你想要
不同的
,你需要明确。为什么整个集合有4个以上的图像名称?@JonasGrønbek。您的数据中存在重复项,或者您没有正确的
JOIN
条件。重复项是由于完全外部联接而返回的。如果您只合并了spot和spot_图像,那么您就不会得到重复的图像。@forpas您是指没有外部/内部/左/右限定符的独立
合并