sql >> Databáze >  >> RDS >> PostgreSQL

Vypočítejte průměr ze sloupce JSON

Vaše pole json je zmatené, jako komentoval @posz . Musí to být:

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

Váš dotaz je také zkroucený mnoha způsoby. Fungovalo by to takto na str. 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.

Na nadcházející str. 9.4 můžeme zjednodušit pomocí nového json_array_elements_text() (také méně náchylné k chybám v obsazení):

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

Další podrobnosti:

Stranou:Bylo by mnohem efektivnější uložit to jako prosté pole (numeric[] , nikoli json ) nebo pro začátek v normalizovaném schématu.




  1. Živé vyhledávání v databázi pomocí CodeIgniter, php5 a MySQL

  2. Pomocí laravel Eloquent Model vložte formát data v dd/mm/yyyy

  3. V PL/SQL vezměte tabulku jako parametr, vyfiltrujte ji a vraťte ji

  4. Oracle Pro*C/OCI instalační obslužné programy pro SIGSEGV/SIGABRT a přátele – proč a jak je deaktivovat?