Jor*_*eno 3 postgresql aggregate window-functions postgis
首先看看StackOverflow上的这个问题。
我希望完成相同的任务,但我还需要ST_Union
向我的查询添加聚合函数(PostGIS )。
如何将答案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;
Run Code Online (Sandbox Code Playgroud)
哪个尖叫:
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;
Run Code Online (Sandbox Code Playgroud)
这取决于您实际尝试实现的目标以及您使用的 Postgres 版本以及基础表的表定义。你选择不透露任何这些。
这为您提供了一个不同的行 per (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;
Run Code Online (Sandbox Code Playgroud)
使用一个ST_Union(geom)
作为聚合窗口函数。geom
聚合实际上也是如此(name, zonedistrict_id)
,这似乎更有可能。
这应该是可能的,因为PostGis 手册告诉我们它的聚合函数:
... 可以像任何其他 sql 聚合函数一样使用,例如 sum、average。
并且 SQL 聚合函数可以用作窗口函数。