我有一个表,其中包含一列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
答案 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;
在即将发布的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
)或以标准化模式存储起来会更有效率。