Получить количество свойств JSONB - PullRequest
1 голос
/ 23 марта 2019

У меня есть столбец jsonb answers, который может выглядеть следующим образом для 3 строк:

{answer1: {label: "", value: "answer1_value1"}, answer2: {label: "", value: "answer2_value1"}}
{answer1: {label: "", value: "answer1_value2"}, answer2: {label: "", value: "answer2_value1"}}
{answer1: {label: "", value: "answer1_value2"}, answer2: {label: "", value: "answer2_value2"}}

Имена свойств ответа могут быть разными для набора строк. Я хочу получить этот результат (количество для каждого ответа, сгруппированного по значению) из приведенного выше примера:

answer1: { answer1_value1: 1, answer1_value2: 2}
answer2: { answer2_value1: 2, answer2_value2: 1}

Возможно ли это?

У меня есть такие имена полей SELECT DISTINCT json_object_keys(answers::json) as field, но я не знаю, что мне делать дальше.

1 Ответ

1 голос
/ 23 марта 2019

Используйте jsonb_each(), чтобы иметь возможность подсчитывать ответы и объединять результаты обратно в объект json:

select jsonb_build_object(key, jsonb_object_agg(val, count))
from (
    select key, value->>'value' as val, count(*)
    from my_table
    cross join jsonb_each(answers) 
    group by key, val
    ) s
group by key;

Рабочий пример в rextester.

...