选择第一行(分组)+添加聚合函数

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,,则查询有效。但它没有联合几何。

Erw*_*ter 9

回答问题

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 BYGROUP 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 聚合函数可以用作窗口函数。

  • 你暗暗猜对了。这正是我所需要的。谢谢!这不仅解决了我的问题,还迫使我将 Postgres 数据移动到新的 AWS EBS 上,因为最初我收到“错误:无法写入临时文件的块 n:设备上没有剩余空间”。我保留了 25 GB,将 Postgres 移到它上面(使用 XFS)并且查询成功返回。谢谢! (2认同)