Суммируйте все элементы в поле массива 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 элементов индекса)?

Запуск Rails 5 и Postgres 9.5.4.

Примечание. Этот пост похож на Как выполнить запрос, используя поля внутри нового типа данных PostgreSQL JSON? - но я ищу способ выполнить итерацию по каждому из элементов массива, чтобы суммировать их (в отличие от прямого вызова их по порядковому номеру).

Обновление... Благодаря ответу @klin ниже я смог собрать версию Rails, которая дала мне общую сумму:

Indicator.joins("cross join lateral jsonb_array_elements(funding)").sum("(value->>'amount')::float")

person Paul Arterburn    schedule 01.09.2016    source источник


Ответы (1)


Используйте jsonb_array_elements().

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