如何在Postgresql中按嵌套数组的重复值分组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Postgresql中按嵌套数组的重复值分组?相关的知识,希望对你有一定的参考价值。

先前的问题:How to group by duplicate value and nested the array Postgresql

使用此查询:

    SELECT json_build_object(
    'nama_perusahaan',"a"."nama_perusahaan",
    'proyek', json_agg(
            json_build_object(
            'no_izin',"b"."no_izin",
            'kode',c.kode,
            'judul_kode',d.judul
        )
    )
)
FROM "t_pencabutan" "a"
LEFT JOIN "t_pencabutan_non" "b" ON "a"."id_pencabutan" = "b"."id_pencabutan"
LEFT JOIN "t_pencabutan_non_b" "c" ON "b"."no_izin" = "c"."no_izin"
LEFT JOIN "t_pencabutan_non_c" "d" ON "c"."id_proyek" = "d"."id_proyek"
GROUP BY "a"."nama_perusahaan"

结果显示如下:


    "nama_perusahaan" : "JASA FERRIE", 
    "proyek" : 
    
        "no_izin" : "26A/E/IU/PMA/D8FD", 
        "kode" : "14302", 
        "judul_kode" : "IND"
    
    
        "no_izin" : "26A/E/IU/PMA/D8FD", 
        "kode" : "13121", 
        "judul_kode" : "IND B"
    

如您所见,proyek已嵌套,因此重复的proyek将被分组。现在,我必须将no_izin的相同值分组,这样它将像下面的预期结果一样将嵌套数组加倍。


    "nama_perusahaan" : "JASA FERRIE", 
    "proyek" : 
    [
        "no_izin" : "26A/E/IU/PMA/D8FD", 
        "kode_list":[
         
              "kode" : "14302", 
              "judul_kode" : "IND"
         ,
         
              "kode" : "13121", 
              "judul_kode" : "IND B"
         ]   
    ]

我尝试使用此查询:

SELECT json_build_object(
    'nama_perusahaan',"a"."nama_perusahaan",
    'proyek', json_agg(
            json_build_object(
            'no_izin',"b"."no_izin",
            'kode_list',json_agg(
                  json_build_object(
                       'kode',c.kode,
                       'judul_kode',d.judul
                  )
             )
        )
    )
)
FROM "t_pencabutan" "a"
LEFT JOIN "t_pencabutan_non" "b" ON "a"."id_pencabutan" = "b"."id_pencabutan"
LEFT JOIN "t_pencabutan_non_b" "c" ON "b"."no_izin" = "c"."no_izin"
LEFT JOIN "t_pencabutan_non_c" "d" ON "c"."id_proyek" = "d"."id_proyek"
GROUP BY "a"."nama_perusahaan", b.no_izin

但是它没有用,它给出ERROR: aggregate function calls cannot be nested LINE 6:'kode_list',json_agg(。我的代码可能会出什么问题?

答案

Disclaimer:对于我们来说,在不知道输入数据和表结构且必须处理未知语言的情况下构造查询非常困难。请尝试minimize您的其他问题(例如,对于您的问题,在将结果转换为JSON输出之前不需要先连接一些表并不重要),用英语创建示例(处理外语会代码看起来令人困惑,并导致拼写错误,因此,可能正确的想法无法将单词写错)和添加输入数据!这也将对您有帮助:您将更快地得到答案,并且代码错误的可能性要少得多(因为现在没有数据,我们无法创建可运行的示例来检查我们的想法)。


创建嵌套的JSON结构只能从最内层的嵌套对象到最外层的对象进行。因此,首先您必须在子查询中创建no_izin数组。这可以用来创建proyek对象:

SELECT 
    json_build_object(
        'nama_perusahaan',"s"."nama_perusahaan",
        'proyek', json_agg(no_izin)
    )
)
FROM (
    SELECT
        "a"."nama_perusahaan",
        json_build_object(
            'no_izin',
            "b"."no_izin",
            'kode_list',
            json_agg(
                json_build_object(
                    'kode',c.kode,
                     'judul_kode',d.judul
                )
            )
        ) AS no_izin
    FROM "t_pencabutan" "a"
    LEFT JOIN "t_pencabutan_non" "b" ON "a"."id_pencabutan" = "b"."id_pencabutan"
    LEFT JOIN "t_pencabutan_non_b" "c" ON "b"."no_izin" = "c"."no_izin"
    LEFT JOIN "t_pencabutan_non_c" "d" ON "c"."id_proyek" = "d"."id_proyek"
    GROUP BY "c"."id_proyek", "a"."nama_perusahaan"
) AS s
GROUP BY "s"."nama_perusahaan"

以上是关于如何在Postgresql中按嵌套数组的重复值分组?的主要内容,如果未能解决你的问题,请参考以下文章

在 LINQ 中按特定列分组 [重复]

在谷歌大查询中按未嵌套值分组时获取不同值的总和

如何使用javascript在嵌套对象数组中按属性分配值

如何在javascript中按id嵌套数据过滤和分组?

如何在reactjs / javascript中按值对对象数组进行分组

javascript在嵌套对象/数组中按值查找