2017-05-06 11 views
0

における重複のクラスタ、私は次のような結果を返す次のクエリを持っている:削除クエリ結果セット

db=# SELECT t1.id as id1, t2.id as id2 
db-# FROM table_1 As t1, table_2 As t2 
db-# WHERE ST_DWithin(t2.lonlat, t1.lonlat, t2.range) 
db-# ORDER BY t1.id, t2.id, ST_Distance(t2.lonlat, t1.lonlat); 
    id1 | id2 
-------+------ 
    4499 | 1118 
    4500 | 1118 
    4501 | 1119 
    4502 | 1119 
    4503 | 1118 
    4504 | 1118 
    4505 | 1119 
    4506 | 1119 
    4507 | 1118 
    4508 | 1118 
    4510 | 1118 
    4511 | 1118 
    4514 | 1117 
    4515 | 1117 
    4518 | 1117 
    4519 | 1117 
    4522 | 1117 
    4523 | 1117 
    4603 | 1116 
    4604 | 1116 
    4607 | 1116 

そして、私は結果セットは次のようになりたい:結果には、基本的に

id1 | id2 
-------+------ 
    4499 | 1118 
    4501 | 1119 
    4503 | 1118 
    4505 | 1119 
    4507 | 1118 
    4514 | 1117 
    4603 | 1116 

クエリではid2の重複が返されますが、id2が結果に何度も出現することがありますが、ではなく、id2がクラスタ内で重複していればではありません。

ここでは、id1はGPS位置表のIDを表し、id2はウェイポイントのテーブルを表しています。ウェイポイントに最も近い通過ポイントを返すクエリーが必要です(ウェイポイント# 1118が通過すると、別のウェイポイントが通過するまで、再び通過することはできません)。

Postgresを使用してこれを行う方法はありますか?

答えて

0

これはギャップと島の問題ですが、微妙です。この場合、前の行が異なるid2の行だけが必要です。それはLAG()を使用することを提案:

SELECT id1, id2 
FROM (SELECT tt.*, LAG(id2) OVER (ORDER BY id1, id2, dist) as prev_id2 
     FROM (SELECT t1.id as id1, t2.id as id2, 
        ST_Distance(t2.lonlat, t1.lonlat) as dist 
      FROM table_1 t1 JOIN 
       table_2 t2 
       ON ST_DWithin(t2.lonlat, t1.lonlat, t2.range) 
      ) tt 
    ) tt 
WHERE prev_id2 is distinct from id2 
ORDER BY id1, id2, dist; 

注:私はid1がユニークと思われるので、提示されたロジックを簡素化することができると思います。したがって、距離の計算は完全に余計なようです。私はその論理を、あなたの実際のクエリに関連する可能性があるために残しました。

+0

ありがとうございました - 私の最後にいくつかのメモ:1. 'id1'は本当にユニークです。 2.ウェイポイント(table_2)までの距離が10メートルの場合、例えばGPS(table_1)は、最初の通過ポイントではなく、*最も近い*通過ポイントを得るために距離計算が重要です。 )は、10m、次に6,4,2,1,3,7,9という距離のレコードを持っていて、ウェイポイントから1mのところにあるtable_1のレコードが必要です。それはあなたの答えに全く影響しますか? –

+0

@AlexCrooks。 。 。あなたは 'id1、id2'で注文しています。私は距離がすべて考慮されているとは思わない。いずれにしても、 'lag()'の 'order by'はあなたが本当に望む' order by 'と一致するはずです。 –

関連する問題