2

私は 2 つのテーブルを持っています。1 つは旅行の開始位置と終了位置を含み、もう 1 つはその旅行中の 1 分ごとの車両の緯度/経度位置を含みます。テーブルは tripID によって関連付けられています。

このようなもの:

trip_table:
TRIPID | DEP | ARR
------------------
1      | CLE | CHI
2      | CLE | ATL
3      | ATL | CLE

position_table:
TRIPID | TIME              | LAT  | LON
-----------------------------------------
2      | May-20-2012T00:23 | 35.4 | -84.2
2      | May-20-2012T00:24 | 35.5 | -84.1
3      | May-21-2012T11:14 | 42.0 | -112.4

2 つの条件で構成されるクエリがあります。 1. 旅行が特定の場所で出発/到着したすべての位置データを取得します。 2. 旅行が特定の緯度/経度を通過したすべての位置データを取得します。

SELECT p.* FROM position AS p 
JOIN trip_table t ON (t.tripid = p.tripid)
WHERE (t.dep = 'CLE' OR t.arr = 'CLE)
OR (p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90)

私の質問は次のとおりです。このクエリを変更して、結果のどの行が最初の条件 (指定された場所に出発/到着した旅行) から来たのか、2 番目の条件 (旅行が指定された緯度/ロン)?

現在、私の唯一の考えは、2 つの個別のクエリを実行することですが、クエリの全体数を削減することが可能であれば、それを避けたいと考えています。

この種の問題に対する標準的な SQL ソリューションがあれば、それは素晴らしいことです。そうでない場合は、PostgreSQL 固有のソリューションも機能します。

編集:なぜ私がこれをやりたいのか疑問に思っている人のために-結果の位置は地図上にプロットされ、境界のある地域から来たのか、2 つの到着/出発場所の間から来たのかに基づいて色分けしたいと思います。

4

2 に答える 2

3

あなたはこのようなことを試すことができます:

SELECT p.col1, p.col2, p.col3,
     t.dep = 'CLE' OR t.arr = 'CLE' AS first_condition,
     p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90 AS second_condition
FROM position AS p 
JOIN trip_table t ON (t.tripid = p.tripid)
WHERE (t.dep = 'CLE' OR t.arr = 'CLE')
OR (p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90)
于 2012-04-27T20:31:30.373 に答える
2

以下のように、ケースステートメントを介して識別できると思います。コードは少し冗長になりますが、Oracle でこれをテストしたところ、動作します。

SELECT p.*,
       case when t.dep = 'CLE' or t.arr = 'CLE' then 'FROM_CLE_CLAUSE'
            when (p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90) then 'OTHER_CLAUSE'
       end
  FROM position AS p 
  JOIN trip_table t 
    ON (t.tripid = p.tripid)
 WHERE (t.dep = 'CLE' OR t.arr = 'CLE)   
    OR (p.lat > 34 AND p.lat < 40 AND p.lon > -100 AND p.lon < -90)
于 2012-04-27T20:37:26.940 に答える