[英]Can get an average of values in a json array using postgres?
postgres的一大優點是它允許索引到json對象 。
我有一列數據格式有點像這樣:
{"Items":
[
{"RetailPrice":6.1,"EffectivePrice":0,"Multiplier":1,"ItemId":"53636"},
{"RetailPrice":0.47,"EffectivePrice":0,"Multiplier":1,"ItemId":"53404"}
]
}
我想做的是找到包含這些數據的每行的平均RetailPrice。
就像是
select avg(json_extract_path_text(item_json, 'RetailPrice'))
但實際上我需要為json對象中的每個項目執行此操作。 因此,對於此示例,查詢的單元格中的值將為3.285
我怎樣才能做到這一點?
可以像這樣工作:
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
);
json_array_elements()
(Postgres 9.3+) json_array_elements()
json
數組是有用的。
我在這里使用隱式JOIN LATERAL
。 就像在這個相關的例子中一樣:
對於支持此類查詢的索引,請考慮以下相關答案:
有關如何最好地存儲EAV數據的詳細信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.