Postgres json_agg排序

时间:2019-11-26 06:17:54

标签: postgresql psql

json_agg的{​​{1}}中有多个表:

psql

我正在尝试计算与农场位置的距离。问题是我正在尝试按“距离”对数据进行排序,但是会引发错误:

  

错误:表“ farm_location”缺少FROM子句条目       第6行:... FROM supply_forecast哪里删除= B'0'ORDER BY farm_locat ...                                                                ^

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;

如果我删除了********** Error ********** ERROR: missing FROM-clause entry for table "farm_location" SQL state: 42P01 Character: 642 ,查询将起作用,但是数据不会按距离排序。关于如何解决这个问题有什么想法吗?

2 个答案:

答案 0 :(得分:1)

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;

答案 1 :(得分:0)

我在函数 json_agg() 中应用 ORDER BY 并且它工作正常

select
    jsonb_agg(jsonb_build_object('toma_parada', app51.app51_tomas__toma_parada)|| jsonb_build_object('lado', app51.app51_tomas__lado)|| jsonb_build_object('existen_tomas_paradas', app51.app51_tomas__existen_tomas_paradas)|| jsonb_build_object('b', app51.app51_tomas__b)|| jsonb_build_object('a', app51.app51_tomas__a)|| jsonb_build_object('m', app51.app51_tomas__m)|| jsonb_build_object('nombre', app51.app51_tomas__nombre, 'id_publico', app51.app51_tomas__id_publico , 'id', app51.app51_tomas__id ) 
    order by app51.app51_tomas__id desc) as app51_tomas,
    app51.fecha_modificacion,
    app51.fecha_creacion,
    app51.id_cliente,
    app51.id_rumas,
    app51.id_usuario,
    app51.id,
    app51.id_publico,
    app51.habilitado,
    app51.borrado,
    app51.produccion_fin,
    app51.produccion_inicio
from
    (
    select
        distinct app51.id_cliente,
        app51.id_rumas,
        app51.id_usuario,
        app51.id,
        app51.id_publico,
        app51.habilitado,
        app51.borrado,
        app51.atributos ->> 'produccion_fin' as produccion_fin,
        app51.atributos ->> 'produccion_inicio' as produccion_inicio,
        app51_tomas.atributos ->> 'toma_parada' as app51_tomas__toma_parada,
        app51_tomas.atributos ->> 'lado' as app51_tomas__lado,
        app51_tomas.atributos ->> 'existen_tomas_paradas' as app51_tomas__existen_tomas_paradas,
        app51_tomas.atributos ->> 'b' as app51_tomas__b,
        app51_tomas.atributos ->> 'a' as app51_tomas__a,
        app51_tomas.atributos ->> 'm' as app51_tomas__m,
        app51_tomas.atributos ->> 'nombre' as app51_tomas__nombre,
        app51_tomas.id as app51_tomas__id ,
        app51_tomas.id_publico as app51_tomas__id_publico ,
        jsonb_build_object() as id_usuario_creacion,
        jsonb_build_object() as id_usuario_modificacion,
        (
        select
            TO_CHAR(app51.fecha_creacion::timestamptz at time zone 'GMT' , 'YYYY-MM-DD"T"HH24:MI:SS.ss0"Z"')) as fecha_creacion ,
        (
        select
            TO_CHAR(app51.fecha_modificacion::timestamptz at time zone 'GMT' , 'YYYY-MM-DD"T"HH24:MI:SS.ss0"Z"')) as fecha_modificacion
    from
        app51
    left join app51_app51_tomas on
        app51_app51_tomas.id_app51 = app51.id
    left join app51_tomas on
        app51_app51_tomas.id_app51_tomas = app51_tomas.id
        and ((app51_tomas.habilitado = true
        and app51_tomas.borrado = false)
        or app51_tomas is null )
    where
        (app51.habilitado = true
        and app51.borrado = false)
    order by
        app51_tomas.id desc) as app51
group by
    app51.fecha_modificacion,
    app51.fecha_creacion,
    app51.id_cliente,
    app51.id_rumas,
    app51.id_usuario,
    app51.id,
    app51.id_publico,
    app51.habilitado,
    app51.borrado,
    app51.produccion_fin,
    app51.produccion_inicio