[英]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
;
结果:
+========+====================+
| gameid | avg_score |
+========+====================+
| 3 | 3.0000000000000000 |
+--------+--------------------+
| 2 | 4.0000000000000000 |
+--------+--------------------+
| 1 | 2.0000000000000000 |
+--------+--------------------+
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.