У меня есть эти данные
Table
id weight
1 1000
1 1000
2 2000
2 2000
3 3000
4 3000
Я пытаюсь найти средний вес различных идентификаторов, кроме 4, и мне нужны данные в этом формате
id avg(weight)
1,2,3 2000
Я пробовал использовать разные, но это дает мне среднее значение, включая все повторяющиеся значения.
SELECT
String_agg(distinct id :: text, ', ') AS ids,
Round(Coalesce(Avg(weight), 0)) AS avg
FROM "table"
where id != 4
Я также пробовал группировать по идентификатору, но он дает мне данные в другом формате, а также не дает мне правильного среднего значения.
SELECT
String_agg(id :: text, ', ') AS ids,
Round(Coalesce(Avg(weight), 0)) AS avg
FROM "table"
where id != 4
group by id
так как я могу найти среднее значение для этого?
Спасибо.


Вы можете попробовать использовать свою текущую логику в подзапросе, который находит отдельные записи:
SELECT
STRING_AGG(id::text, ',' ORDER BY id) AS ids,
ROUND(COALESCE(AVG(weight), 0)) AS avg
FROM
(
SELECT DISTINCT id, weight
FROM "table"
WHERE id <> 4
) t;
Примечание: я добавил предложение ORDER BY к вашему вызову STRING_AGG, чтобы гарантировать, что идентификаторы отображаются в том порядке, в котором вы хотите.