web-dev-qa-db-ja.com

最初の行を選択(グループ化)+集計関数を追加

まずStackOverflowで この質問 を見てください。

クエリに集計関数(PostGISの_ST_Union_)も追加する必要があることを除いて、同じタスクを実行したいと考えています。

DISTINCT を使用して集計と組み合わせる方法...

私はもう試した:

_SELECT DISTINCT ON (name, zonedistrict_id)
       ST_Union(geom) as geom, gid, name, zonedistrict_id, zonestyle_id, longname 
FROM zones
ORDER BY name, zonedistrict_id, zonestyle_id;
_

どの悲鳴:

_column "zones.gid" must appear in the GROUP BY clause or be used in an aggregate function_

奇妙なのは、ST_Union(geom) as geom,を削除するとクエリが機能するためです。しかし、それは結合されたジオメトリーがありません。

2
Jordan Arseno

質問への回答

_SELECT DISTINCT ON (name, zonedistrict_id)
       ST_Union(geom) as geom, gid, name, zonedistrict_id, zonestyle_id, longname 
FROM   zones
GROUP  BY gid, name, zonedistrict_id, zonestyle_id, longname
ORDER  BY name, zonedistrict_id, zonestyle_id;_

実際に達成しようとしていること、使用しているPostgresのバージョン、および基になるテーブルのテーブル定義によって異なります。あなたはそのいずれも開示しないことを選択しました。

これにより、_(name, zonedistrict_id)_ごとに1つの異なる行が得られますが、geomは_(gid, name, zonedistrict_id, zonestyle_id, longname)_の集計にすぎません

古いバージョンでは、_GROUP BY_リストにSELECTリストの非集計列をすべてリストする必要がありました。これはPostgreSQL 9.1で多少変更されました。 リリースノートを引用

_GROUP BY_句で主キーが指定されている場合、クエリターゲットリストで非_GROUP BY_列を許可する(Peter Eisentraut)

私の推測

しかし、私はあなたが密かにこれを望んでいると思います:

_SELECT DISTINCT ON (name, zonedistrict_id)
       ST_Union(geom) OVER (PARTITION BY name, zonedistrict_id) AS geom
     , gid, name, zonedistrict_id, zonestyle_id, longname 
FROM   zones
ORDER  BY name, zonedistrict_id, zonestyle_id;_

集約ウィンドウ関数としてST_Union(geom)を使用する。したがって、geomは実際には_(name, zonedistrict_id)_の総計です。

PostGisマニュアルでは、その集計関数について説明しています

... sum、averageなどの他のSQL集計関数と同じように使用できます。

また、SQL集計関数はウィンドウ関数として使用できます。

9