1

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 のいずれかになります。

4

2 に答える 2

1

正しく理解していれば(よくわかりません)、クエリは次のようになります

SELECT COALESCE(b.gps_coords, c.gps_coords) AS gps_coords,
       COALESCE(b.year, c.year) AS year,
       COALESCE(b.value, 0) + COALESCE(c.value, 0) AS value
  FROM
(
  SELECT d.gps_coords, d.year, SUM(d.value) AS value
    FROM data d JOIN regions r
      ON d.gps_coords = r.gps_coords
   WHERE d.metric = 5 AND r.region_id = 1
   GROUP BY d.gps_coords, d.year
) b FULL JOIN
(
  SELECT d.gps_coords, d.year, SUM(d.value) AS value
    FROM data d JOIN regions r
      ON d.gps_coords = r.gps_coords
   WHERE (d.metric = 4 AND r.region_id = 3)
   GROUP BY d.gps_coords, d.year
) c
    ON b.gps_coords = c.gps_coords
   AND b.year = c.year
 ORDER BY gps_coords

出力例:

| | GPS_COORDS | 年 | 年 | 値 |
------|------|--------|
| | 506 | 2010年 | 236.76 |
| | 507 | 2010年 | 10.32 |
| | 508 | 2010年 | 462.9 |
| | 509 | 2010年 | 45.24 |

これがSQLFiddleのデモです

于 2013-08-26T05:38:15.013 に答える
0

このSQLは、私が必要としているものを正確に提供します:

SELECT a.gps_coords, 
  a.year, 
  COALESCE(AVG(b.v1), 0) + COALESCE(AVG(b.v2), 0)
FROM data a
LEFT JOIN (
  SELECT d.gps_coords, d.year, d.value as v1, NULL v2
    FROM data d JOIN regions r
      ON d.gps_coords = r.gps_coords
   WHERE d.metric = 4 AND r.region_id = 3
UNION
  SELECT d.gps_coords, d.year, NULL, d.value
    FROM data d JOIN regions r
      ON d.gps_coords = r.gps_coords
   WHERE d.metric = 5 AND r.region_id = 2
) b
ON b.gps_coords = a.gps_coords
AND a.year = b.year
GROUP BY a.gps_coords, a.year
ORDER BY a.gps_coords

出力

|  gps_coords  |  year  |  value  |
|  506         |  2010  |  236.76 |
|  507         |  2010  |  0      |
|  508         |  2010  |  434.4  |
|  509         |  2010  |  45.24  |
于 2013-09-02T02:37:46.673 に答える