Vaše pole json je zmatené, jako komentoval @posz . Musí to být:
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]}');
Váš dotaz je také zkroucený mnoha způsoby. Fungovalo by to takto na str. 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;
Na nadcházející str. 9.4 můžeme zjednodušit pomocí nového json_array_elements_text()
(také méně náchylné k chybám v obsazení):
SELECT t.id, avg(x::numeric) AS avg_speed
FROM tbl t
, json_array_elements_text(speed_data->'speed') x
GROUP BY t.id;
Další podrobnosti:
Stranou:Bylo by mnohem efektivnější uložit to jako prosté pole (numeric[]
, nikoli json
) nebo pro začátek v normalizovaném schématu.