Postgresql

選擇第一行(分組)+添加聚合函式

  • July 31, 2020

首先在 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 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;

使用ST_Union(geom)as聚合視窗函式geom實際上聚合也是如此(name, zonedistrict_id),這似乎更有可能。

這應該是可能的,因為PostGis 手冊告訴我們它的聚合函式

… 可以像任何其他 sql 聚合函式一樣使用,例如 sum、average。

並且 SQL 聚合函式可以用作視窗函式。

引用自:https://dba.stackexchange.com/questions/41494