json - Postgresql中json类型列的GROUP BY内容
问题描述
我有一个带有名为“food”的 json 列的 Postgresql 表。
以下是一些行的示例:
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 字段的内容进行 GROUP BY 而不考虑元素的顺序?如果两行具有相同的内容,那么我希望它们组合在一起。
我的计划是 GROUP BY json_array_elements(food),但由于某种原因,这只返回每行的第一个元素。
解决方案
实际上类似于@Scoots的答案,但没有分类,windows,aso:
SELECT (
SELECT jsonb_agg(items order by items)
FROM jsonb_array_elements(food) AS items
) AS food,
count(*)
FROM test_json_grouping
GROUP BY 1;
...解释:
QUERY PLAN
------------------------------------------------------------------------------------------------------
HashAggregate (cost=1635.60..1890.60 rows=200 width=40)
Group Key: (SubPlan 1)
-> Seq Scan on test_json_grouping (cost=0.00..1629.25 rows=1270 width=32)
SubPlan 1
-> Aggregate (cost=1.25..1.26 rows=1 width=32)
-> Function Scan on jsonb_array_elements items (cost=0.00..1.00 rows=100 width=32)
(6 rows)
结果:
food | count
---------------------------------------+-------
["cheese", "eggs", "salmon"] | 2
["broccoli", "ham", "milk"] | 1
["cheese", "eggs", "pizza", "salmon"] | 1
(3 rows)
推荐阅读
- date - odoo13 bad sheded on delivery order 和我在确认销售订单前 13 天收到的报价请求
- r - RStudio 会话无法重新启动或终止
- python - Python转置/堆叠多列
- javascript - 为什么我的重启按钮不起作用?(井字游戏)
- qt - 用鼠标滚动文本 像触摸屏一样单击并按住
- r - mgcv GAM:`by`参数中有多个变量(平滑变化超过1个因子)
- java - Spring Boot Thin Jar gradle 插件不适用于 gradle 7.1
- python - Pandas 数据框按索引选择行,按名称选择列
- javascript - JS:Function.prototype.apply() 或 call() 什么时候需要引用 this
- vuetify.js - Vuetify 2 行,但呈现为 2 列