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.