当前位置: 首页 > 面试题库 >

PostgreSql:使用横向联接的行的Json数组

王英彦
2023-03-14
问题内容

我的表的详细信息字段中有两个以下JSON数组,并且需要像在另一个关系表中使用的那样评估查询。

{
    "city": "London",
    "name": "Sainburry",
    "quantities": [112, 145, 222, 122, 124],
    "prices": [4, 4, 4, 0, 3],
    "dates": ["13.05.2020", "14.05.2020", "15.05.2020", "16.05.2020", "17.05.2020"]
}

我想对此JSON数组评估以下查询:

select quantities,
       prices,
       AVG(quantities/prices::float) as ratio
from my_table
where city = 'London'
group by quantities, prices;

我使用了以下查询 和许多类似的查询,包括横向联接

select q.*
from my_table mt
  cross join json_array_elements_text(details -> 'quantities') as q

但是,当通过交叉联接将其他字段(价格和日期)添加到查询中时,行数成倍增加。因此,我正在寻找要使用的新功能Lateral Join,但无法正确应用。如何Lateral Join在PostgreSQL中使用获得先前查询的结果?任何帮助,将不胜感激。

更新:

这是小提琴。如果我成功地将json数组值转换为行而不乘(可以返回5条记录),则可以评估所需的结果。只需帮助我使用
横向 连接和 json_array_elements_text 将json数组转换为行。


问题答案:

似乎由于数组的顺序,您需要WITH ORDINALITY连同LEFT JOIN LATERALs来匹配数组的相应元素:

SELECT q.elm AS quantities, p.elm AS prices, 
       AVG(p.elm::float/q.elm::float) AS ratio
  FROM my_table t0
  LEFT JOIN LATERAL jsonb_array_elements(details -> 'quantities') 
    WITH ORDINALITY AS q(elm, i) ON TRUE
  LEFT JOIN LATERAL jsonb_array_elements(details -> 'prices') 
    WITH ORDINALITY AS p(elm, i) ON q.i = p.i
  LEFT JOIN LATERAL jsonb_array_elements(details -> 'dates') 
    WITH ORDINALITY AS d(elm, i) ON d.i = q.i
 WHERE t0.details ->> 'city' = 'London'   
 GROUP BY q.elm, p.elm;

[Demo](https://dbfiddle.uk/?rdbms=postgres_11&fiddle=f1d10e0675b6342288775522462d13c5)



 类似资料:
  • 问题内容: 我有一个像这样构造的表: 我想查询此表以得到这样的结果: 我想不出办法。那可能吗 ?如何 ? 非常感谢你。 问题答案: 这是Postgres内置的,因为有几个版本,因此您不再需要定义自己的名称,名称为。 (这是Postgres 8.4.8)。 请注意,未指定no ,因此结果行的顺序取决于所使用的分组方法(此处为哈希),即未定义。例子: 现在,我不知道为什么会收到和,因为应该按顺序发送行

  • 问题内容: 我正在使用Postgres 9.3。 我有两个表 以及它们之间的关系。现在,我想创建一个视图,该视图除了T1的列外,还为T1中的每个记录提供一列,其中包含一个包含T2所有相关记录的主键ID的数组。如果T2中没有相关条目,则此列的相应字段应包含空值。 我的架构的抽象版本如下所示: 可以如下生成相应的样本数据: 到目前为止,我提出了以下查询: 这行得通。但是,可以简化吗? 可以在此处找到相

  • 问题内容: 参考原始的stackoverflow问题,我试图将gin索引应用于Postgres 9.4中数组对象中的键,但没有得到第一个答案中所述的结果。 您能纠正错误吗? 我遵循的步骤已写在下面。 第1部分:创建表和索引 第2部分:查询 该查询给出空结果。 我也尝试使用GIN索引。 替代索引和查询: 问题答案: 原始答案中的这个特定jsonb示例缺少用于包含查询的非原始对象周围的数组层。此后已修

  • 我有以下不便之处,我想只使用PostgreSQL更新JSON数组的键。我有以下json: 如果“othern”=X,我需要将“othern”更新为另一个数字 (X是我传递给查询的任何数字。例如,如果othern=5,则更新othern)。 这个JSON可能要大得多,所以我需要一些可以在JSON数组中迭代的东西,找到所有与X数匹配的“othern”,并替换为新的。非常感谢。 我尝试了Postgres

  • 问题内容: 我有一个存储ID列表的JSON字段(我不知道这是最佳实践),我想知道是否可以在此JSON字段上使用do操作并在sql中使用它们。 以下是我要实现的虚拟示例,是否可以实现? 有了以上数据,我想构建一个查询,使我得到如下结果: 我在想以下一些伪风格的SQL,尽管我仍然不知道这是否可行,或者我将使用mysql提供的JSON函数实现此目的 如果问题不清楚,请告诉我。 问题答案: 借助Feras

  • 问题内容: 我正在尝试使用PostgreSQL 9.2中添加的功能将查询结果映射到JSON 。 我在找出将连接的行表示为嵌套对象(1:1关系)的最佳方式时遇到麻烦 这是我尝试过的内容(设置代码:表格,示例数据,后跟查询): 查询本身: 我发现如果使用,我可以将结果字段分离为一个子对象,但似乎仅限于一个级别。我不能插入更多的语句,因为我认为在这种情况下我需要。 为我提供了列名,因为在该表的结果中,我