【问题标题】:Postgres: Nested Aggregate JSONPostgres:嵌套聚合 JSON
【发布时间】:2015-11-04 18:01:47
【问题描述】:

我正在查询的表如下所示:

namespace | key   | value
---------------------------
foo       | bar   | baz
foo       | alpha | beta
gamma     | delta | epsilon

我想像这样将它从数据库中提取出来:

{
    "foo": {
        "bar": "baz",
        "alpha": "beta"
    },
    "gamma": {
        "delta": "epsilon"
    }
}

json_object_agg 并没有真正让我超越第一级,因为你不允许嵌套聚合函数。但据我所知,我需要在GROUP BY 中添加GROUP BY,但我不确定这是否可能。也许解决方案与WINDOWs有关?

【问题讨论】:

    标签: json database postgresql multidimensional-array


    【解决方案1】:
    with t (namespace, key, value) as (
        values
        ('foo','bar','baz'),('foo','alpha','beta'),('gamma','delta','epsilon')
    ), s as (
        select namespace, json_object_agg(key, value) as joa
        from t
        group by namespace
    )
    select json_object_agg(namespace, joa)
    from s
    ;
                                      json_object_agg                                   
    ------------------------------------------------------------------------------------
     { "foo" : { "bar" : "baz", "alpha" : "beta" }, "gamma" : { "delta" : "epsilon" } }
    

    由于 CTE 是一个优化障碍,这个版本可能会更快:

    with t (namespace, key, value) as (
        values
        ('foo','bar','baz'),('foo','alpha','beta'),('gamma','delta','epsilon')
    )
    select json_object_agg(namespace, joa)
    from (
        select namespace, json_object_agg(key, value) as joa
        from t
        group by namespace
    ) s
    

    【讨论】:

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