Среднее из нескольких массивов в Postgres - PullRequest
0 голосов
/ 11 мая 2018

Я хочу рассчитать среднее значение для нескольких массивов (json) в Postgres.

У меня есть следующая таблица:

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

Любая помощьБуду очень признателен, так как я довольно новичок в Postgres.Поэтому я хочу получить следующий результат:

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

1 Ответ

0 голосов
/ 11 мая 2018

Вы можете использовать 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...