【问题标题】:Nested JSON aggregation in PostgresPostgres 中的嵌套 JSON 聚合
【发布时间】:2020-02-02 16:23:17
【问题描述】:

我需要对 Postgres 数据库运行查询并将其聚合并使用本机 Postgres 工具将其导出为 json 对象。

我不能完全让聚合正常工作,我有点难过。

以下是部分数据示例

| msgserial |  object_type  | payload_key |                          payload                          | user_id |
+-----------+---------------+-------------+-----------------------------------------------------------+---------+
|   1696962 | CampaignEmail | a8901b2c    | {"id": "ff7221da", "brand": "MAGIC", "eventType": "SENT"} |     001 |
|   1696963 | OtherType     | b8901b2c    | {"id": "ff7221db", "brand": "MAGIC", "eventType": "SENT"} |     001 |
|   1696964 | OtherType     | c8901b2c    | {"id": "ff7221dc", "brand": "MAGIC", "eventType": "SENT"} |     002 |
|   1696965 | OtherType     | d8901b2c    | {"id": "ff7221dd", "brand": "MAGIC", "eventType": "SENT"} |     001 |
|   1696966 | CampaignEmail | e8901b2c    | {"id": "ff7221de", "brand": "MAGIC", "eventType": "SENT"} |     001 |
|   1696967 | CampaignEmail | f8901b2c    | {"id": "ff7221df", "brand": "MAGIC", "eventType": "SENT"} |     002 |
|   1696968 | SomethingElse | g8901b2c    | {"id": "ff7221dg", "brand": "MAGIC", "eventType": "SENT"} |     001 |
+-----------+---------------+-------------+-----------------------------------------------------------+---------+

我需要输出这样一个按 user_id 分组的 JSON 对象

{
  "user_id": 001,
  "brand": "MAGIC",
  "campaignEmails": [
    {"id": "ff7221da", "brand": "MAGIC", "eventType": "SENT"},
    {"id": "ff7221de", "brand": "MAGIC", "eventType": "SENT"},
    {"id": "ff7221de", "brand": "MAGIC", "eventType": "SENT"}
  ],
  "OtherTypes": [
    {"id": "ff7221db", "brand": "MAGIC", "eventType": "SENT"},
    {"id": "ff7221dd", "brand": "MAGIC", "eventType": "SENT"}
  ],
  "Somethingelses": [
    {"id": "ff7221dg", "brand": "MAGIC", "eventType": "SENT"}
  ]
},
{
  "user_id": 002,
  "campaignEmails": [
  ],
  "OtherTypes": [

  ],
  "Somethingelses": [
  ]
}

基本上需要将所有有效负载按其类型分组到数组中,这些数组由 user_id 分组

我从 JSONB_BUILD_OBJECT 开始,将其中一个 object_types 组合到一个数组中,但后来被难住了。

我是否试图在原始 PSQL 中实现不可能的目标?我真的很难过,我一直遇到错误,比如 X 需要包含在 GROUP BY 子句中等等......

我可以将其中一个 object_types 分组到一个按 user_id 分组的数组中,但似乎不能全部完成 3 个

我的另一个想法是要有 3 个子查询,但我也不知道该怎么做。

【问题讨论】:

    标签: sql postgresql aggregate jsonb


    【解决方案1】:

    您需要两个聚合,第一个由 user_id, object_type 分组,另一个由 user_id 分组:

    select 
        jsonb_build_object('user_id', user_id) 
        || jsonb_object_agg(object_type, payload) as result
    from (
        select user_id, object_type, jsonb_agg(payload) as payload
        from my_table
        group by user_id, object_type
        ) s
    group by user_id
    

    Db<>Fiddle.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 2021-12-14
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多