Агрегация объектов Json на реляционной таблице в Postgres - PullRequest
1 голос
/ 23 октября 2019

У меня есть реляционная таблица, которая содержит три значения переменных, идентификатор и дату, разбитую на части.

ID | Year | Month | Day | A | B | C | 
 1   2019     12    01    5   10  15
 1   2019     12    02    2   4   6 
 1   2019     11    01    1   2   3
 1   2019     11    02    10  9   8 

Цель состоит в том, чтобы объединить эти данные в JSONB / реляционную таблицу со столбцами A, B и C в объекте JSONB: {A: 5, B: 10, C: 15}который является значением для другого объекта JSONB с Днем в качестве ключа.

{01:{A:5, B:10, C:15}}

Кроме того, я хочу объединить данные таким образом, чтобы все данные за каждый месяц были в одном объекте, а конечный результат выглядит следующим образом:

ID | Year | Month | Data                                     |
 1   2019    12     {01:{A:5, B:10, C:15},02:{A:2, B:4, C:6}}
 1   2019    11     {01:{A:1, B:2, C:3},02:{A:10, B:9, C:8}}

IЯ смог получить данные по ряду за каждый день, но я застрял при их агрегировании по месяцам, годам и идентификаторам.

Любая помощь будет очень ценной.

1 Ответ

3 голосов
/ 23 октября 2019

Вы можете использовать json_build_object() и json_object_agg():

select
    id,
    year,
    month,
    json_object_agg(day, json_build_object('A', A, 'B', B, 'C', C)) "data"
from mytable
group by
    id,
    year,
    month

Демонстрация на DB Fiddle :

| id  | year | month | data                                                |
| --- | ---- | ----- | --------------------------------------------------- |
| 1   | 2019 | 11    | {"1":{"A":1,"B":2,"C":3},"2":{"A":10,"B":9,"C":8}}  |
| 1   | 2019 | 12    | {"1":{"A":5,"B":10,"C":15},"2":{"A":2,"B":4,"C":6}} |
...