You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:58:14