Как сгруппировать по идентификатору и создать массив объектов JSON в postgreSQL? - PullRequest
1 голос
/ 28 июня 2019

У меня есть таблица транзакций, где мне нужно сгруппировать по customerId и создать агрегированные записи JSON в массиве.

customerId|transactionVal|day
      1234|             2|2019-01-01
      1234|             3|2019-01-04
        14|             1|2019-01-01

Я хочу вернуть что-то вроде этого:

customerId|transactions
      1234|[{'transactionVal': 2, 'day': '2019-01-01'}, {'transactionVal': 3, 'day': '2019-01-04'}]
        14|[{'transactionVal': 1, 'day': '2019-01-01'}]

Мне понадобится позже выполнить каждую транзакцию в массиве, чтобы вычислить% изменений в transactionVal.

Я искал какое-то время, но, похоже, не смог найти что-то для этого, так как таблица довольно большая> 70 миллионов строк.

Спасибо!

1 Ответ

1 голос
/ 29 июня 2019

Должно быть возможно использовать array_agg и json_build_object примерно так:

ok=# select customer_id, 
     array_agg(json_build_object('thing', thing, 'time', time)) 
     from test group by customer_id;

 customer_id |                                             array_agg                                             
-------------+---------------------------------------------------------------------------------------------------
           2 | {"{\"thing\" : 1, \"time\" : 1}"}
           1 | {"{\"thing\" : 1, \"time\" : 1}",
                "{\"thing\" : 2, \"time\" : 2}",
                "{\"thing\" : 3, \"time\" : 3}"}
(2 rows)

ok=# select * from test;
 customer_id | thing | time 
-------------+-------+------
           1 |     1 |    1
           2 |     1 |    1
           1 |     2 |    2
           1 |     3 |    3
(4 rows)

ok=# 
...