PostgreSQL:CTE结合GROUP BY出现GroupingError问题求助
问题根源与修正方案
错误出在CTE的初始成员部分:你使用了聚合函数ST_Union(geom),但没有对city_name进行分组,数据库要求非聚合列必须出现在GROUP BY子句中,这就是报错的核心原因。
另外你的递归CTE没有终止条件,会无限重复获取已加入的城市,同时可能导致商铺被重复统计,以下是修正后的完整SQL:
WITH RECURSIVE CityAndAdjacent AS ( -- 初始成员:获取目标城市的合并地理范围,必须GROUP BY city_name SELECT city_name, ST_Union(geom) AS city_and_adjacent_geom FROM GEO WHERE city_name = 'City name' GROUP BY city_name UNION ALL -- 递归成员:获取相邻城市,添加去重条件避免无限递归 SELECT GEO.city_name, GEO.geom FROM GEO INNER JOIN CityAndAdjacent ca ON ST_Intersects(GEO.geom, ca.city_and_adjacent_geom) WHERE NOT EXISTS ( SELECT 1 FROM CityAndAdjacent existing WHERE existing.city_name = GEO.city_name ) ) SELECT ca.city_name, -- 用DISTINCT避免商铺因跨边界被重复统计(如果有需要) COUNT(DISTINCT s.shop_id) AS shop_count FROM CityAndAdjacent ca LEFT JOIN SHOPS s ON ST_Within(s.geom, ca.city_and_adjacent_geom) GROUP BY ca.city_name;
关键调整说明:
- 初始成员添加
GROUP BY city_name,满足聚合函数的分组要求,直接解决GroupingError问题。 - 递归CTE添加
RECURSIVE关键字(PostgreSQL等数据库要求显式声明递归CTE)。 - 递归成员中用
NOT EXISTS排除已加入的城市,终止递归并避免生成重复的城市行。 - 统计商铺时使用
COUNT(DISTINCT s.shop_id)(假设SHOPS表有主键shop_id),防止同一商铺因位于城市边界被多次统计。
内容的提问来源于stack exchange,提问作者raummensch
相关产品推荐
相关产品推荐

