Сумма всех элементов в массив типа 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 2

1 ответ:

Использование jsonb_array_elements()

select sum((value->>'amount')::float)
from indicators
cross join lateral jsonb_array_elements(funding)