sql >> Database >  >> RDS >> PostgreSQL

Bereken het gemiddelde uit de JSON-kolom

Je json-array is in de war, zoals @posz heeft gereageerd . Zou moeten zijn:

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

Je vraag is ook op meerdere manieren verdraaid. Zou zo werken in 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.

In de komende pagina 9.4 we kunnen vereenvoudigen met de nieuwe json_array_elements_text() (ook minder foutgevoelig in de 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;

Meer details:

Terzijde:het zou veel efficiënter zijn om dit op te slaan als een gewone array (numeric[] , niet json ) of in een genormaliseerd schema om mee te beginnen.




  1. Praktische tips voor URL's met spatie en speciale tekens

  2. Selecteer de hele rij ophalen die overeenkomt met max in MySQL Group

  3. PDO bindParam probleem

  4. Vervang null door 0 in MySQL