Postgresql
選擇第一行(分組)+添加聚合函式
首先在 StackOverflow 上查看這個問題。
我希望完成相同的任務,除了我還需要在
ST_Union
我的查詢中添加一個聚合函式(PostGIS’s )。如何將答案
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)
,但geom
只是聚合超過(gid, name, zonedistrict_id, zonestyle_id, longname)
SELECT
在舊版本中,您必須在列表中列出列表的每個非聚合列GROUP BY
。這在 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)
as聚合視窗函式。geom
實際上聚合也是如此(name, zonedistrict_id)
,這似乎更有可能。這應該是可能的,因為PostGis 手冊告訴我們它的聚合函式:
… 可以像任何其他 sql 聚合函式一樣使用,例如 sum、average。
並且 SQL 聚合函式可以用作視窗函式。