我有一个表,其中包含一列要从中提取信息的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
您的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]}');
您的查询也以多种方式扭曲。在第 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提琴。
在即将到来的pg 9.4中, 我们可以使用新的来简化操作json_array_elements_text()(转换中也不太容易出错):
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)或以规范化模式存储会更加有效。
numeric[]
json