Сумма всех элементов в массив типа JSONB области
Если моя таблица настроена следующим образом:
indicators:
id: 56789,
funding (JSONB): [
{
amount: 345678
},
{
amount: 7899
}
]
Я могу успешно суммировать первые суммы на каждой записи с помощью:
Рельсы - Indicator.sum("(funding->0->>'amount')::float")
SQL - SELECT SUM((funding->0->>'amount')::float) FROM "indicators"
Как бы Вы запросили сумму всех amounts
(а не только 0 элементов индекса)?
Бегущие Рельсы 5 & Postgres 9.5.4.
Примечание: Эта запись похожа на Как я могу запросить, используя поля внутри нового типа данных PostgreSQL JSON? - но я ищу способ перебрать каждый из этих вариантов. элементы массива для их суммирования (в отличие от прямого вызова по индексному номеру).
Обновление... Благодаря ответу @klin ниже, я смог собрать версию Rails, которая дала мне совокупный итог:
Indicator.joins("cross join lateral jsonb_array_elements(funding)").sum("(value->>'amount')::float")
1 ответ:
Использование
jsonb_array_elements()
select sum((value->>'amount')::float) from indicators cross join lateral jsonb_array_elements(funding)