繁体   English   中英

在 postgres 中获取 JSONB 数组的平均值

[英]Get average of JSONB array in postgres

我有一个 postgres 表“游戏”,其中包含游戏的不同分数。 我想查询所有游戏并获得该特定游戏的所有分数的平均分数。 我尝试了很多不同的查询,但由于 JSONB 数据类型,我总是遇到麻烦。 游戏数据以 JSONB 格式保存,游戏表如下所示:

gameID     gameInfo
---------------------------------------------------------------
  1        {
            "scores": [
            {
              "scoreType": "skill",
              "score": 1
            },
            {
              "scoreType": "speed",
              "score": 3
            },
            {
              "scoreType": "strength",
              "score": 2
            }
            ]}

  2        {
            "scores": [
            {
              "scoreType": "skill",
              "score": 4
            },
            {
              "scoreType": "speed",
              "score": 4
            },
            {
              "scoreType": "strength",
              "score": 4
            }
            ]}

  3         {
            "scores": [
            {
              "scoreType": "skill",
              "score": 1
            },
            {
              "scoreType": "speed",
              "score": 3
            },
            {
              "scoreType": "strength",
              "score": 5
            }
            ]}

预期 output:

游戏编号 平均分
1 2
2 4
2 3

我可以使用什么查询来获得预期的 output?

提取表示数组的 JSONB,使用 JSONB function 获取 JSONB 数组,提取字符串值。

select gameid, avg(score::int) s
from (
  select gameid, jsonb_array_elements(gameInfo #>'{scores}') ->'score' score
  from foo
) t
group by gameid
order by gameid

您也可以通过以下方式使用横向连接:

select gameID, avg((s->>'score')::int) avg_score
from g, lateral jsonb_array_elements((gameInfo->>'scores')::jsonb) s
group by gameID
;

SQL 在线编辑

结果:

+========+====================+
| gameid | avg_score          |
+========+====================+
| 3      | 3.0000000000000000 |
+--------+--------------------+
| 2      | 4.0000000000000000 |
+--------+--------------------+
| 1      | 2.0000000000000000 |
+--------+--------------------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM