Sql 获取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

我在postgres表中有一些数据,它是json数据数组的字符串表示,如下所示:

[
  {"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摄取