PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Calcola la media dalla colonna JSON

Il tuo array json è incasinato, come @posz ha commentato . Dovrebbe essere:

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]}');

Anche la tua query è contorta in diversi modi. Funzionerebbe in questo modo a pagina 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.

Nella prossima pagina 9.4 possiamo semplificare con il nuovo json_array_elements_text() (anche meno soggetto a errori nel cast):

SELECT t.id, avg(x::numeric) AS avg_speed
FROM   tbl t
     , json_array_elements_text(speed_data->'speed') x
GROUP  BY t.id;

Maggiori dettagli:

A parte:sarebbe molto più efficiente archiviarlo come semplice array (numeric[] , non json ) o in uno schema normalizzato per cominciare.