PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Berechnen Sie den Durchschnitt aus der JSON-Spalte

Ihr json-Array ist durcheinander, wie @posz kommentiert . Müsste lauten:

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

Ihre Abfrage ist auch in mehrfacher Hinsicht verdreht. Würde so in Seite 9.3 funktionieren :

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.

In der kommenden Seite 9.4 wir können mit dem neuen json_array_elements_text() vereinfachen (auch weniger fehleranfällig in der Besetzung):

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

Weitere Einzelheiten:

Übrigens:Es wäre viel effizienter, dies als einfaches Array zu speichern (numeric[] , nicht json ) oder zunächst in einem normalisierten Schema.