如何按标识符分组并在 postgreSQL 中创建一个 JSON 对象数组?
How do I group by identifier and create an array of JSON objects in postgreSQL?
我有 table 笔交易,我需要按 customerId 分组并在数组中创建汇总的 JSON 记录。
customerId|transactionVal|day
1234| 2|2019-01-01
1234| 3|2019-01-04
14| 1|2019-01-01
我想要做的是 return 像这样的事情:
customerId|transactions
1234|[{'transactionVal': 2, 'day': '2019-01-01'}, {'transactionVal': 3, 'day': '2019-01-04'}]
14|[{'transactionVal': 1, 'day': '2019-01-01'}]
稍后我需要遍历数组中的每个事务以计算 transactionVal
中的百分比变化。
我搜索了一段时间,但似乎找不到解决这个问题的方法,因为 table 非常大,超过 7000 万行。
谢谢!
应该可以像这样使用 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=#
我有 table 笔交易,我需要按 customerId 分组并在数组中创建汇总的 JSON 记录。
customerId|transactionVal|day
1234| 2|2019-01-01
1234| 3|2019-01-04
14| 1|2019-01-01
我想要做的是 return 像这样的事情:
customerId|transactions
1234|[{'transactionVal': 2, 'day': '2019-01-01'}, {'transactionVal': 3, 'day': '2019-01-04'}]
14|[{'transactionVal': 1, 'day': '2019-01-01'}]
稍后我需要遍历数组中的每个事务以计算 transactionVal
中的百分比变化。
我搜索了一段时间,但似乎找不到解决这个问题的方法,因为 table 非常大,超过 7000 万行。
谢谢!
应该可以像这样使用 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=#