2017-05-11 12 views
0

私は以下の問題を抱えています。私はそれらの間の最短距離を計算したい緯度と経度のデータセットを持っています。Postgres - 関数のパラメータとしてのクエリ結果

明示的にパラメータを指定するときに機能する解決策が見つかりましたが、これらのパラメータを取得するクエリを使用して現在失敗しています。私のクエリは、次のようになります。

可変データの最初のサブクエリは、すべての緯度/経度座標のノードIDを取得します。後続のsourcedとtargetdは、この大きなデータセットをソースノードとターゲットノードに分割し、すべての行を配列に連結します。結果のデータセットには、配列を持つレコードが1つしかありません。

メインクエリでは、pgr_dijkstraが適用され、すべての送信元ノードとすべての送信先ノード間の最短ルートが検出されます。このアルゴリズムの署名が

pgr_dijkstra(text,anyarray,anyarray,boolean) 

述べたクエリがしかし、レコードを生成し、この問題を解決するために、次の関数

pgr_dijkstra(text,record,record,boolean) 

方法はあり呼び出そうとしているのですか?明示的にレコード変数を任意の配列にキャストすると(例えば、sourced :: bigint [])、このキャストは不可能であることを示す別の例外がスローされます。

ありがとうございました。

+0

テストのためには、「テーブルソースAS SELECT array_agg」を作成し、データタイプを変更してみてください。しかし、リテラル配列を使った実例を1つ表示し、SELECT'にあるものと比較してください。 –

+0

'sourced.array_agg、targetd.array_agg'をパラメータとして試してみてください。明示的なカラムエイリアスも複数使用することもできます(ソース)AS(...)または 'SELECT array_agg(id)ASソース ')を指定します。 – pozs

+0

ここでパフォーマンス上の問題があるかどうかはわかりません。しかし、私はこれと同様の制限でtsrpを使ってルートを計算していましたが、時間がルートの数に比例するので遅すぎたので、一緒に計算するのではなく、マルチスレッドでC#アプリケーションを作成し、データベース。 –

答えて

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 
    )