【问题标题】:Can get an average of values in a json array using postgres?可以使用 postgres 获取 json 数组中的平均值吗?
【发布时间】:2014-08-26 18:20:04
【问题描述】:

postgres 的一大优点是它allows indexing into a json object

我有一列数据的格式有点像这样:

{"Items":
  [
    {"RetailPrice":6.1,"EffectivePrice":0,"Multiplier":1,"ItemId":"53636"},
    {"RetailPrice":0.47,"EffectivePrice":0,"Multiplier":1,"ItemId":"53404"}
  ]
}

我想做的是使用这些数据找到每行的平均零售价格。

有点像

select avg(json_extract_path_text(item_json, 'RetailPrice')) 

但实际上我需要为 items json 对象中的每个项目执行此操作。所以对于这个例子,查询单元格中的值是 3.285

我该怎么做?

【问题讨论】:

  • 不要将 JSON 用于结构良好的数据。非常糟糕的主意。
  • 问题是,数据很难解析。在完整的数据集中,“Items”只是较大 JSON 对象的一个​​属性。另外,每条记录的属性差异很大,每条记录可能有 50 个不同的属性,你永远不知道在任何给定时间会出现哪些。如果您愿意帮助我弄清楚如何将其存储在数据库中,我很乐意与您讨论更多信息
  • 所以它不像您的示例那样结构良好。由于在某种程度上涉及替代方案,因此 JSON 可能是一个不错的选择。检查这个答案:stackoverflow.com/a/876459/131874

标签: sql json postgresql aggregate-functions entity-attribute-value


【解决方案1】:

可以这样工作:

WITH cte(tbl_id, json_items) AS ( 
   SELECT 1
        , '{"Items": [
       {"RetailPrice":6.1,"EffectivePrice":0,"Multiplier":1,"ItemId":"53636"}
      ,{"RetailPrice":0.47,"EffectivePrice":0,"Multiplier":1,"ItemId":"53404"}]}'::json
   )
SELECT tbl_id, round(avg((elem->>'RetailPrice')::numeric), 3) AS avg_retail_price
FROM   cte c
     , json_array_elements(c.json_items->'Items') elem
GROUP  BY 1;

CTE 只是替换如下表格:

CREATE TABLE tbl (
   tbl_id     serial PRIMARY KEY
 , json_items json
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 2013-09-29
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    相关资源
    最近更新 更多