Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql中json类型列的按内容分组_Json_Postgresql - Fatal编程技术网

Postgresql中json类型列的按内容分组

Postgresql中json类型列的按内容分组,json,postgresql,Json,Postgresql,我有一个Postgresql表,其中有一个名为food的json列 以下是一些行的示例: food ["cheese", "salmon", "eggs"] ["salmon", "cheese", "eggs"] ["broccoli", "ham", "milk"] ["salmon", &qu

我有一个Postgresql表,其中有一个名为food的json列

以下是一些行的示例:

food
["cheese", "salmon", "eggs"]
["salmon", "cheese", "eggs"]
["broccoli", "ham", "milk"]
["salmon", "cheese", "eggs", "pizza"]
当前结果:

food                                       count
["cheese", "salmon", "eggs"]              | 1
["salmon", "cheese", "eggs"]              | 1
["broccoli", "ham", "milk"]               | 1
["salmon", "cheese", "eggs", "pizza"]     | 1
预期结果:

food                                       count
["cheese", "salmon", "eggs"]              | 2
["broccoli", "ham", "milk"]               | 1
["salmon", "cheese", "eggs", "pizza"]     | 1
有没有一种方法可以根据json字段的内容分组,而不考虑元素的顺序?如果两行具有相同的内容,那么我希望将它们分组在一起


我的计划是按json_array_elementsfood分组,但出于某种原因,这只返回每行的第一个元素。

不是直接返回-对于Postgres,它们是不同的字符串

然而,我们可以做的是通过json_数组_元素解压这些json字符串,然后使用json_agg应用的我们自己的排序重新打包它们。然后将它们均质化,以供您的团队使用

这里有一个问题正好说明了我的意思:

select
    __food.food::text,
    count(1)
from (
    select
        json_agg(_unpack.food order by _unpack.food::text asc) as food
    from (
        select
            row_number() over(),
            json_array_elements(food) as food
        from
            YOUR_SCHEMA.YOUR_FOOD_TABLE
    ) as _unpack
    group by
        _unpack.row_number
) as __food
group by
    __food.food::text

实际上与@Scoots的答案类似,但没有排序、windows和aso:

选择 选择jsonb_aggitems按项目排序 来自jsonb_数组_元素作为项目 作为食物, 计数* 来自test_json_分组 分组1例; ……解释说:

查询计划 --------------------------------------------------- HashAggregate成本=1635.60..1890.60行=200宽=40 组密钥:子计划1 ->测试时的顺序扫描\u json\u分组成本=0.00..1629.25行=1270宽度=32 子计划1 ->总成本=1.25..1.26行=1宽=32 ->jsonb_数组_元素项上的函数扫描成本=0.00..1.00行=100宽度=32 6排 结果:

食物计数 --------------------+---- [奶酪、鸡蛋、鲑鱼]| 2 [西兰花、火腿、牛奶]| 1 [奶酪、鸡蛋、比萨饼、鲑鱼]| 1 3排
我忘了你可以从函数的输出中选择。这是一个很好的答案。这是一个非常优雅的解决方案。正是我需要的。非常感谢。我继续进行上述选择,但感谢您的回复!