Postgres json_agg 排序依据

Arn*_*bal 1 postgresql psql

我在json_aggfor中有多个表psql

SELECT json_agg(t) FROM (SELECT *, 
    ( SELECT row_to_json(b) FROM ( SELECT * from (SELECT *, ( (3959 * acos( cos( radians(6.414478) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(12.466646) ) + sin( radians(6.414478) ) * sin( radians( lat ) ) ) ) * 1.609344 ) AS distance
    from farm_location ) al WHERE farm_location_id=supply_forecast.farm_location_id and distance < 100 ) b) as farm_location, 
    ( SELECT json_agg(c) FROM ( SELECT * 
    FROM supply_forecast_status_history WHERE supply_forecast_id=supply_forecast.supply_forecast_id) c) as supply_forecast_status
FROM supply_forecast WHERE delete = B'0' ORDER BY farm_location.distance desc) t;
Run Code Online (Sandbox Code Playgroud)

我正在尝试计算距农场位置的距离。问题是我试图按“距离”对数据进行排序,但它抛出一个错误:

错误:表“farm_location”第 6 行缺少 FROM 子句条目:...FROM Supply_forecast WHERE delete = B'0' ORDER BY farm_locat... ^

********** Error **********

ERROR: missing FROM-clause entry for table "farm_location"
SQL state: 42P01
Character: 642
Run Code Online (Sandbox Code Playgroud)

如果我删除ORDER BY farm_location.distance desc查询,但数据不会按距离排序。关于如何解决这个问题有什么想法吗?

ϻᴇᴛ*_*ᴛᴀʟ 5

json_agg函数可以支持order by参数。

SELECT json_agg(t.* ORDER BY distance desc) FROM 
    (SELECT *, 
        (SELECT row_to_json(b) FROM 
            (SELECT * from 
                (SELECT *
                    , ((3959 * acos( cos( radians(6.414478)) * cos( radians( lat )) * cos(radians( lng ) 
                        - radians(12.466646) ) + sin( radians(6.414478) ) * sin( radians( lat ) ) ) ) * 1.609344 ) as distance
                from farm_location) al 
            where farm_location_id=supply_forecast.farm_location_id and distance < 100 
            ) b
        ) as farm_location
        , (select json_agg(c) 
            from (SELECT * FROM supply_forecast_status_history 
                WHERE supply_forecast_id=supply_forecast.supply_forecast_id) c
            )as supply_forecast_status
    FROM supply_forecast WHERE delete = B'0' 
) t;
Run Code Online (Sandbox Code Playgroud)