sql - 在 Postgres 上的关系表上聚合 Json 对象

标签 sql json postgresql aggregate-functions jsonb

我有一个关系表,其中包含三个变量值、一个 ID 和分解成多个部分的日期。

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}}

我已经能够为每天创建一行数据,但我无法按月、年和 ID 汇总它们。

如有任何帮助,我们将不胜感激。

最佳答案

您可以使用 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

Demo on 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}} |

关于sql - 在 Postgres 上的关系表上聚合 Json 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58513658/

相关文章:

asp.net - 用于跨数据库表的 LINQ to SQL。还是查看?

json - 在 Unity3d 中编写和读取一些 Transform 到文本文件的简单方法?

javascript - 如何使用复杂的 JSON 创建 YUI3 数据表?

javascript - 如何使用 jQuery/JSON 限制字符数

java - PostgresQL 和 Hibernate 自动生成(不是 PK)值

ruby-on-rails - 如何查找*所有*匹配类别的项目

postgresql - 为 PostgreSQL 中的多列和不同行选择第一个非空值

mysql - NetBeans 可以选择除主键字段之外的所有列

sql - 在 H2 数据库中插入当前日期和时间

sql - 用于匹配 T-SQL 脚本中所有注释的正则表达式