0

私はPostgreSQLを初めて使用するので、我慢してください。

2つのテーブルがあります。1つは複数のポリゴンを持つ「polys」と呼ばれ、もう1つは1つのポリゴンのみを含む「box」と呼ばれます(私の境界ボックス)。私のクエリでは、バウンディングボックス「ボックス」内にある「ポリゴン」内のすべてのポリゴンを選択します。必要に応じてクリップを選択します。両方のテーブルには2つの列があり、1つはIDを含み、もう1つは「the_geom」と呼ばれるGeoJSONを含みます。

必要なのは、バウンディングボックス内にあるポリゴンのIDを含む1つの列、「the_geom_webmercator」と呼ばれるこれらのポリゴンのGeoJSONを含む別の列、各ポリゴンの領域を含む「polygonarea」と呼ばれる別の列、そして各ポリゴンの同じ正確な値(値はすべてのポリゴンの合計です)。ただし、SUMを要求するだけでは、1つの値しか返されないため、機能しません。代わりに、この値を列全体に入力する必要があります。以下は私が試したものです。「SUM...AS」は問題の部分です。

SELECT polys.id, ST_Transform(ST_Intersection(polys.the_geom, box.the_geom),3857)
AS the_geom_webmercator,
ST_Area(ST_Transform(ST_Intersection(polys.the_geom,box.the_geom),3857))
AS polygonarea,
SUM(ST_Area(ST_Transform(ST_Intersection(polys.the_geom,box.the_geom),3857)))
AS totalarea FROM polys,box
4

1 に答える 1

2

SUM()集計関数を使用する場合は、GROUPBYステートメントも必要です。

あなたが欲しいのはWINDOW関数だと思います

http://www.postgresql.org/docs/9.1/static/tutorial-window.html

ウィンドウ関数を使用すると、GROUPBYを使用せずに単一行の集計を計算できます。

SELECT 
 polys.id, 
 ST_Transform(ST_Intersection(polys.the_geom, box.the_geom),3857) AS the_geom_webmercator,
 ST_Area(ST_Transform(ST_Intersection(polys.the_geom,box.the_geom),3857)) AS polygonarea,
 SUM(ST_Area(ST_Transform(ST_Intersection(polys.the_geom,box.the_geom),3857)))  OVER () AS totalarea
FROM polys,box
于 2012-06-06T09:47:24.000 に答える