Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
Sql Postgres中多个数组的平均值_Sql_Postgresql - Fatal编程技术网

Sql Postgres中多个数组的平均值

Sql Postgres中多个数组的平均值,sql,postgresql,Sql,Postgresql,我想计算Postgres中多个(json)数组的平均值 我有下表: CREATE TABLE marks (student varchar(48), year int , testresult json); INSERT INTO marks VALUES ('John',2017,'[7.3,8.1,9.2]'), ('Mary', 2017, '[6.1,7.4,5.6]'), ('Tim',2017,'[6.3,5.6,8.3]'); 2017年共有3名学生参

我想计算Postgres中多个(json)数组的平均值

我有下表:

CREATE TABLE marks (student varchar(48), year int , testresult json);

INSERT INTO marks 
VALUES ('John',2017,'[7.3,8.1,9.2]'),
      ('Mary', 2017, '[6.1,7.4,5.6]'), 
     ('Tim',2017,'[6.3,5.6,8.3]');
2017年共有3名学生参加了3次考试。我想计算2017年所有学生的平均考试成绩(精度为n)

我自己也尝试过,到目前为止只取得了以下成果:

所以我想得到以下结果:

student|  year | averages   
-------+-------+-----------
All    |  2017 | [6.567, 7.033, 7.700]

您可以使用
unest
,进行计算并聚合回JSON格式:

WITH cte AS (
   SELECT 'All' AS student, year, AVG(unnest::decimal(10,2)) AS av
   FROM marks,
   unnest(ARRAY(SELECT json_array_elements_text(testresult))) with ordinality
   GROUP BY year, ordinality
)
SELECT student, year, array_to_json(array_agg(av::decimal(10,3))) AS averages
FROM cte
GROUP BY student, year;
输出:

+---------+------+---------------------+
| student | year |      averages       |
+---------+------+---------------------+
| All     | 2017 | [6.567,7.033,7.700] |
+---------+------+---------------------+

太棒了!谢谢你快速而有用的回答。因此,正如我正确理解的,数组被拆分,并且有序性保持原始顺序?然后将平均值再次连接到一个新数组?@web\U student是的,没错。我尝试过这个查询,它成功了。当我尝试使用一个大数据集(30K+记录)进行查询时,当平均json列包含一个大json数组(60k+元素)时,我将无法执行查询,并出现以下错误:内存分配请求大小无效。这仅仅是因为数据集太大吗?@web_student行数很重要。我相信你也应该有一个“按顺序排列”的规则