самом деле массив:
[{value: 20, ...}, {value: 30, ....}, ...]
Можно ли как-то сделать агрегацию value, без вложенных селектов?
Вот это не взлетело:
select t.id, avg((t.download->>'value')::numeric) as avg_download
from my_table t
group by t.id
Нужно сначала "развернуть" JSON-массив в rows, а уже потом применять агрегатные функции (получится ли это без вложенных SELECT, сходу не скажу... да и какая разница).
А можно подробнее? Это с помощью функций json_array_elements_text и подобных?
Да, с помощью подобных.
Спасибо, так получилось: select m.id, avg((d->>'value')::numeric) as avg_download from measurement m, json_array_elements(m.download) d group by m.id А в чем смысл этого? Хочется просто понять поглубже, зачем нужно: 'Expands a JSON array to a set of JSON values.'
Эээ... чтобы получалось писать такие запросы, например (я всегда как-то теряюсь, когда кто-то задаёт вопросы вроде "зачем нужно умножение?" или "зачем нужен оператор получения элемента из массива?" ;) ).
Имеется ввиду, я хочу понять - зачем конкретно постгресу распаковывать JSON массив. Как пример: в нереляционных базах это не обязательно зачастую
Это нужно не постгресу, а Вам, чтобы получить желаемый результат, нет? ;) Т.е. реляционки в норме работают с relations, поэтому и подходы к обработке данных в них такие. А так — есть же jsonpath. Может, на нём можно написать аналогичное выражение?
Я не знаком с jsonpath. Вообще почитаю что-нибудь, у меня большой пробел с работой с жсоном в реляционных базах
https://www.postgresql.org/docs/current/functions-json.html#FUNCTIONS-SQLJSON-PATH
Обсуждают сегодня