sql >> Databasteknik >  >> RDS >> PostgreSQL

Beräkna genomsnittet från JSON-kolumnen

Din json-array är trasig, som att @posz kommenterade a> . Skulle behöva vara:

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

Din fråga är också vriden på flera sätt. Skulle fungera så här på sidan 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-fiol.

På den kommande sidan 9.4 vi kan förenkla med den nya json_array_elements_text() (även mindre felbenägen i rollistan):

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

Mer information:

Bortsett från:Det skulle vara mycket effektivare att lagra detta som vanlig array (numeric[] , inte json ) eller i ett normaliserat schema till att börja med.




  1. Postgresql transaktionshantering med java

  2. PHP/MySQL-tidszonsförtydligande

  3. Fatalt fel:Anrop till odefinierad funktion sqlsrv_connect()

  4. sqlalchemy postgresql där int =sträng