小编典典

从JSON列计算平均值

sql

我有一个表,其中包含一列要从中提取信息的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

阅读 308

收藏
2021-05-16

共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()(转换中也不太容易出错):

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)或以规范化模式存储会更加有效。

2021-05-16