GPS 座標のデータを取得するプログラムがあります。データベースのリージョン ID に基づいてデータセットを取得できます。これは次のようになります。
gps_coords | year | value
105 | 2010 | 5.63
102 | 1990 | 3.2
103 | 2000 | 13.23
...
a.value + b.value
ここで、それと別のクエリ セットを、またはのような sql と組み合わせたいと考えています(a.value+50)*b.value/100
。また、メトリクス (クエリ対象のデータセット) によってクエリをフィルター処理します。
問題は、両方の gps_coords を 1 つの列として取得する方法です。同じテーブルでa を実行する必要があると考えましJOIN
たが、同じ列で a.gps_coords と b.gps_coords の両方を取得する方法がわかりません。
私のクエリ (以下) は 100 ミリ秒でゼロ行で実行されます。だから、何がうまくいかないのかわからない。同じ列でaとbの両方のgps_coordsを取得する方法を知っている人はいますか? 私はPostgresqlを使用していますが、何でも役に立ちます。ありがとう!
スキーマ
データ:
gps_coords
year
value
metric
地域:
gps_coords
region_id
サンプルデータ:
データ
| gps_coords | year | value | metric |
| 506 | 2010 | 23.23 | 5 |
| 507 | 2010 | 10.32 | 5 |
| 508 | 2010 | 28.5 | 5 |
| 509 | 2010 | 45.24 | 5 |
| 506 | 2010 | 213.53 | 4 |
| 507 | 2010 | 0 | 4 |
| 508 | 2010 | 434.4 | 4 |
| 509 | 2010 | 381.1 | 4 |
地域
| gps_coords | region_id |
| 506 | 1 |
| 506 | 2 |
| 506 | 3 |
| 507 | 1 |
| 508 | 1 |
| 508 | 3 |
| 509 | 1 |
| 509 | 2 |
望ましい出力:
リージョン 1 のメトリック 5 の座標が必要で、リージョン 3 のメトリック 4 (gps_coords 506 でオーバーラップ) が追加された場合、すべての gps_coords (リージョンに関係なく) を返し、指定された値 (交差する場所に追加) を返したいとします。 :
| gps_coords | year | value |
| 506 | 2010 | 233.76 |
| 507 | 2010 | 0 |
| 508 | 2010 | 434.4 |
| 509 | 2010 | 45.24 |
サンプル (間違った) SQL:
SELECT DISTINCT init.gps_coords, init.year, a.value + b.value as value
FROM data as init
INNER JOIN data as a USING (metric, value)
INNER JOIN data as b USING (metric, value)
INNER JOIN regions as r
ON (init.gps_coords = r.gps_coords)
AND r.region_id = 1
INNER JOIN regions as ra
ON (a.gps_coords = ra.gps_coords)
AND ra.region_id = 2
INNER JOIN regions as rb
ON (init.gps_coords = rb.gps_coords)
AND rb.region_id = 3
WHERE a.metric = 5
AND b.metric = 4
ORDER BY init.gps_coords
上記は、すべての領域 (領域 1) のすべての座標であり、それらが交差する場所で値が追加されます (ra.region 2 には座標 506 と 509 が含まれ、rb.region 3 の座標: 506 と 508 で追加されます)。座標 506)。507 はどちらのリージョン ID にも表示されないため、0 または null のいずれかになります。