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

Beregn gennemsnit fra JSON-kolonnen

Dit json-array er rodet, som at @posz kommenterede a> . Skulle være:

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 forespørgsel er også fordrejet på flere måder. Ville fungere sådan på side 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.

I den kommende side 9.4 vi kan forenkle med den nye json_array_elements_text() (også mindre fejltilbøjelig i rollebesætningen):

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

Flere detaljer:

Bortset fra:Det ville være meget mere effektivt at gemme dette som almindeligt array (numeric[] , ikke json ) eller i et normaliseret skema til at begynde med.




  1. i redshift postgresql kan jeg springe kolonner over med kopifunktionen

  2. Finde en bestemt kolonne i en ukendt tabel i en database?

  3. MySQL ukendt kolonnefejl ved brug af ALTER, forstår ikke adfærd

  4. Hvordan udvikler man en efter-serverror-trigger i Oracle?