Votre tableau json est foiré, comme @posz a commenté . Devrait être :
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]}');
Votre requête est également tordue de plusieurs manières. Cela fonctionnerait comme ceci à la page 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;
Dans la prochaine page 9.4 nous pouvons simplifier avec le nouveau json_array_elements_text()
(également moins sujet aux erreurs dans le casting):
SELECT t.id, avg(x::numeric) AS avg_speed
FROM tbl t
, json_array_elements_text(speed_data->'speed') x
GROUP BY t.id;
Plus de détails :
A part :il serait beaucoup plus efficace de stocker ceci sous forme de tableau simple (numeric[]
, pas json
) ou dans un schéma normalisé pour commencer.