使用 json 路径对 jsonb 对象执行分组

Posted

技术标签:

【中文标题】使用 json 路径对 jsonb 对象执行分组【英文标题】:Perform group by on jsonb object using a json path 【发布时间】:2021-06-05 20:57:34 【问题描述】:

我在 Postgres 列中有一个名为 metrics 的 jsonb 对象,其结构如下:

"http": "GET": "statusCode": "200": "count": 100, "500": "count": 322

我想通过不同的 httpmethodstatusCode 获得总计数,以便我可以使用 Grafana 绘制它。有人可以指出我如何使用 group by。预期结果应该是:

httpMethod statusCode sum(count)
GET        200        100
GET        500        322

【问题讨论】:

【参考方案1】:

假设结构是常量,并且计数是整数值:

SELECT h.key AS http_method
     , s.key AS status_code
     , sum((s.value->>'count')::int) AS sum_count
FROM   tbl t
     , jsonb_each(t.js->'http') h
     , jsonb_each(h.value->'statusCode') s
GROUP  BY h.key, s.key;

db小提琴here

jsonb_each() 在隐式 CROSS JOIN LATERAL 连接中是关键因素。

关于LATERAL

What is the difference between LATERAL JOIN and a subquery in PostgreSQL? Optimizing GROUP BY + COUNT DISTINCT on unnested jsonb column

【讨论】:

@Erwin。非常感谢。它就像一种魅力,虽然现在我正在努力将它融入 grafana,但这是一场不同的战斗。

以上是关于使用 json 路径对 jsonb 对象执行分组的主要内容,如果未能解决你的问题,请参考以下文章

关于pgsql 几个操作符的效率测试比较

如何使用 Slick 在 Postgres 中将 json 对象插入到 jsonb 类型的列中

有没有办法对 jsonb 对象中的值列表应用条件?

如何将 JSON 对象推送到 postgresql 中 jsonb 列中的数组

plpgsql jsonb_set 用于带有嵌套数组的 JSON 对象数组

检测 jsonb 属性是数组还是对象