如何在不将其添加到GROUP BY的情况下添加字段?

时间:2015-10-29 18:32:24

标签: postgresql postgis

我有一个按原样运行的SQL语句。我得到一个区域名称和该区域内的最小值。接下来,我需要添加一个键,这样我才能真正对结果做些什么。密钥是必要的,因为名称和值不太可能是唯一的。

select g.name, min(g.rndval) from
(
    select p.rndval, a.name, p.id
    from points p, areas a
    where ST_WITHIN(p.geom, a.geom)
) AS g
group by g.name

当我将Id字段添加到group by时,查询会返回每个区域的多行,正如预期的那样,因为它按名称和ID组合进行分组,结果不再是我需要的。我应该如何添加id字段(内部选择中的p.id)?

2 个答案:

答案 0 :(得分:0)

您可以尝试:

WITH cte AS
(  select p.rndval, a.name, p.id
   from points p, areas a
   where ST_WITHIN(p.geom, a.geom)
), cte_aggregated AS
(
   SELECT name, min(rndval) AS min_value
   FROM cte
   GROUP BY name
)
SELECT DISTINCT c.rndval, c.name, c.id
FROM cte c
JOIN cte_aggregated ca
  ON c.rndval = ca.min_value
 AND c.name = ca.name;

答案 1 :(得分:0)

你可以通过窗口功能非常优雅地解决这个问题:

select name, rndval as min, id
from (
  select a.name, p.rndval, p.id, rank() over (partition by a.name order by p.rndval) as rnk
  from points p
  join areas a on ST_Within(p.geom, a.geom)) as g
where rnk = 1;