PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Calcular a média da coluna JSON


Seu array json está confuso, como @posz comentou . Teria de ser:
CREATE TABLE tbl (id int, speed_data json);

INSERT INTO tbl VALUES
  (391982, '{"speed":[1.3,1.3,1.4,1.5]}')
, (391983, '{"speed":[0.9,0.8,0.8,1.0]}');

Sua consulta também é distorcida de várias maneiras. Funcionaria assim na página 9.3 :
SELECT t.id, avg(x::text::numeric) AS avg_speed
FROM   tbl t
     , json_array_elements(speed_data->'speed') x
GROUP  BY t.id;

SQL Fiddle.

Na próxima página 9.4 podemos simplificar com o novo json_array_elements_text() (também menos propenso a erros no elenco):
SELECT t.id, avg(x::numeric) AS avg_speed
FROM   tbl t
     , json_array_elements_text(speed_data->'speed') x
GROUP  BY t.id;

Mais detalhes:

A parte:seria muito mais eficiente armazenar isso como array simples (numeric[] , não json ) ou em um esquema normalizado para começar.