sql >> Base de Datos >  >> RDS >> PostgreSQL

Calcular el promedio de la columna JSON

Su matriz json está en mal estado, como @posz comentó . Tendría que 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]}');

Su consulta también está retorcida de múltiples maneras. Funcionaría así en pg 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.

En la próxima página 9.4 podemos simplificar con el nuevo json_array_elements_text() (también menos propenso a errores en el reparto):

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

Más detalles:

Aparte:sería mucho más eficiente almacenar esto como una matriz simple (numeric[] , no json ) o en un esquema normalizado para empezar.