まず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,
を削除するとクエリが機能するためです。しかし、それは結合されたジオメトリーがありません。
_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集計関数はウィンドウ関数として使用できます。