我有一个按原样运行的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)?
答案 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;