Если моя таблица настроена так:
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 элементов индекса)?
Запуск Rails 5 и Postgres 9.5.4.
Примечание. Этот пост похож на Как выполнить запрос, используя поля внутри нового типа данных PostgreSQL JSON? - но я ищу способ выполнить итерацию по каждому из элементов массива, чтобы суммировать их (в отличие от прямого вызова их по порядковому номеру).
Обновление... Благодаря ответу @klin ниже я смог собрать версию Rails, которая дала мне общую сумму:
Indicator.joins("cross join lateral jsonb_array_elements(funding)").sum("(value->>'amount')::float")