Sql 获取postgres中json数据数组列中元素的平均值
我在postgres表中有一些数据,它是json数据数组的字符串表示,如下所示:Sql 获取postgres中json数据数组列中元素的平均值,sql,arrays,json,postgresql,amazon-redshift,Sql,Arrays,Json,Postgresql,Amazon Redshift,我在postgres表中有一些数据,它是json数据数组的字符串表示,如下所示: [ {"UsageInfo"=>"P-1008366", "Role"=>"Abstract", "RetailPrice"=>2, "EffectivePrice"=>0}, {"Role"=>"Text", "ProjectCode"=>"", "PublicationCode"=>"", "RetailPrice"=>2}, {"Role"=&g
[
{"UsageInfo"=>"P-1008366", "Role"=>"Abstract", "RetailPrice"=>2, "EffectivePrice"=>0},
{"Role"=>"Text", "ProjectCode"=>"", "PublicationCode"=>"", "RetailPrice"=>2},
{"Role"=>"Abstract", "RetailPrice"=>2, "EffectivePrice"=>0, "ParentItemId"=>"396487"}
]
这是一个单元格中的数据,来自我的数据库中的一列类似数据
数据库中存储的数据类型为varchar(max)
我的目标是找到“Role”=>“Abstract”的每个json项目的平均零售价,包括数组中的所有json元素和数据库中的所有行
比如:
SELECT avg(json_extract_path_text(json_item, 'RetailPrice'))
FROM (
SELECT cast(json_items to varchar[]) as json_item
FROM my_table
WHERE json_extract_path_text(json_item, 'Role') like 'Abstract'
)
现在,很明显,这个特定的查询不起作用,原因有几个。Postgres不允许您直接将varchar转换为varchar[]。即使在我有了一个数组之后,这个查询也不会对数组进行迭代。可能还有其他问题,但我希望这有助于澄清我想要得到什么
关于如何从数据库中所有这些json数据数组中获取平均零售价,有什么建议吗?红移似乎不支持
json
数据类型本身。至少,
但我发现了一些,应该是有用的:
JSON_ARRAY_LENGTH
JSON_EXTRACT_ARRAY_ELEMENT_TEXT
JSON_EXTRACT_PATH_TEXT
由于不支持generate_series()
,因此我们必须替换它
SELECT tbl_id
, round(avg((json_extract_path_text(elem, 'RetailPrice'))::numeric), 2) AS avg_retail_price
FROM (
SELECT *, json_extract_array_element_text(json_items, pos) AS elem
FROM (VALUES (0),(1),(2),(3),(4),(5)) a(pos)
CROSS JOIN tbl
) sub
WHERE json_extract_path_text(elem, 'Role') = 'Abstract'
GROUP BY 1;
- 我用一个穷人的解决方案替换了它:一个从0到n的虚拟表(值
表达式)。确保您的计数达到数组中可能的最大元素数。如果您需要定期创建一个实际的
表numbers
- 现代Postgres有更好的选择,比如
取消对json\u array\u elements()
数组的测试。与你的兄弟姐妹问题相比:json
这很难,因为。如果您每行有固定数量的json数组元素,或者至少有一个小的最大值,那么您可以即兴创作……而且我希望
{“UsageInfo”:“P-1008366”…
而不是{“UsageInfo”=>“P-1008366”…
(:
而不是
)对于有效的json。@Clodoaldo:我重新打开了它。不是重复的,因为这是针对Amazon Redshift的,需要不同的解决方案。@Erwin为什么您认为另一个不是Redshift?Redshift现在支持json路径文件的json摄取