PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Calculer la moyenne à partir de la colonne JSON

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;

SQL Fiddle.

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.