sql - Postgres 中多个数组的平均值

标签 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名学生参加了3次考试。我想计算 2017 年所有学生考试的平均值(精度为 n)。

自己亲自尝试过,到现在只实现了以下几点: http://www.sqlfiddle.com/#!15/58f38/44

所以我想得到如下结果:

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

最佳答案

您可以使用unnest,进行计算并聚合回 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] |
+---------+------+---------------------+

DBFiddle Demo

关于sql - Postgres 中多个数组的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50297481/

相关文章:

php - 我如何使用一个表项中的 id 连接另一个表项

mysql - 如何进行右子查询?

java - 删除 Hibernate 中的类 id

java - 为什么我无法使用准备好的语句来更新数据库?

mysql - 如何在 drupal View 中添加 DISTINCT、GROUP BY 子句

mysql - sql创建表,条件是2列不能具有相同的值

sql - 如何根据最大时间间隔进行选择

mongodb - 用于存储非关系数据的 AWS 数据库解决方案

postgresql - 链接到静态库以构建静态可执行文件

sql - 如何在多个列上对我的 cfquery 进行分组?