从JSON列计算平均值

时间:2014-12-08 22:31:30

标签: sql json postgresql types aggregate-functions

我有一个表,其中包含一列JSON数据,我想从中提取信息。具体来说,我只想获得平均值。

我的例子:

id      speed_data
391982  [{"speed":1.3,"speed":1.3,"speed":1.4,"speed":1.5...
391983  [{"speed":0.9,"speed":0.8,"speed":0.8,"speed":1.0...

我想要的例子:

id      speed_data
391982  1.375
391982  0.875

有关如何使此查询生效的任何建议吗?

select t.*, avg(x.speed)
from tbl t,
    json_array_elements(a->'speed') x
order by random()
limit 1

1 个答案:

答案 0 :(得分:1)

你的json数组搞砸了,就像@posz commented一样。必须是:

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

您的查询也会以多种方式扭曲。在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.

在即将发布的pg 9.4 中,我们可以使用新的json_array_elements_text()进行简化(在演员阵容中也更不容易出错):

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

更多详情:

除此之外:将它作为普通数组(numeric[]而不是json)或以标准化模式存储起来会更有效率。