如何将集合返回函数移动到 LATERAL FROM 项目 PostgreSQL

Tom*_*Tom 11 sql arrays postgresql json lateral-join

我试试这个

select created_at, 
sum((json_array_elements(shipping_lines::json) ->> 'price')::float) as shipping_price
from t1
group by 1
Run Code Online (Sandbox Code Playgroud)

它显示错误:

错误:聚合函数调用不能包含设置返回函数调用第 5 行:sum(((json_array_elements(shipping_lines::json) ->> 'price')... ^ 提示:您也许可以移动设置返回函数进入 LATERAL FROM 项目。

如何使用 Lateral From 解决这个问题?我读了这个 PsSQL 文档,但并没有真正理解横向功能

GMB*_*GMB 9

那将是:

select t1.created_at, sum((x.obj->>'price')::float)  as shipping_price
from t1
left join lateral jsonb_array_element(t1.shipping_lines::jsonb) as x(obj) on true 
group by 1
Run Code Online (Sandbox Code Playgroud)

或者,您可以计算sum()横向连接本身,这避免了外部聚合的需要(假设它created_at在表中是唯一的):

select t1.created_at, x.shipping_price
from t1
cross join lateral (
    select sum((x.obj->>'price')::float) as shipping_price
    from jsonb_array_elements(t1.shipping_lines::jsonb) as x(obj)
) x
Run Code Online (Sandbox Code Playgroud)

请注意,我稍微更改了要使用的查询,jsonb而不是json:这种新数据类型更加灵活和高效json(即使它不会在这里产生真正的区别,只要有选择,它就应该是首选)。