Postgres - Queryresults作为函数参数

时间:2017-05-11 12:49:19

标签: postgresql

我有以下问题:我有一个纬度和经度点的数据集,我想计算所有这些点之间的最短距离。

虽然我找到了一个解决方案,它在显式指定参数时有效,但使用查询来获取这些参数当前都失败了。我的查询如下:

  with data as(
   SELECT testlonglat.*,f as id
   FROM  testlonglat, LATERAL get_closest_node( long,lat) f),
  sourced as (
   SELECT array_agg(id) from data where source = true),
  targetd as (
   SELECT array_agg(id) from data where source = false)
  SELECT *
  FROM sourced,
       targetd,
       LATERAL pgr_dijkstra(
                 'SELECT id,source,target,length::float8 AS cost FROM us1'::text,
                 sourced,
                 targetd,
                 false)

变量数据的第一个子查询获得每个纬度/经度坐标的节点ID。随后的sourced和targetd只是将这个大型数据集划分为源节点和目标节点,并将所有行连接成一个数组。结果数据集仅包含1个带数组的记录。

主查询应用pgr_dijkstra查找所有源节点和所有目标节点之间的最短路径。该算法的签名是

pgr_dijkstra(text,anyarray,anyarray,boolean)

但是,所述查询会生成记录并尝试调用以下函数

pgr_dijkstra(text,record,record,boolean)

有没有办法解决这个问题?将记录变量显式地转换为任何数组(例如,sourced :: bigint [])只会引发另一个异常,说明这种转换是不可能的。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

with data as(
    select testlonglat.*,f as id
    from  testlonglat, lateral get_closest_node( long,lat) f
), sourced as (
    select array_agg(id) as aid from data where source = true
), targetd as (
    select array_agg(id) as aid from data where source = false
)
select *
from
    sourced,
    targetd,
    lateral pgr_dijkstra (
        'select id,source,target,length::float8 as cost from us1'::text,
        (select aid from sourced),
        (select aid from targeted),
        false
    )