更新postgresql中表的所有行
我将表格的每一行与其他每一行进行比较,以找到最小距离。我还想添加两列,一列称为“最近的距离”,另一列称为“最近的距离”。 我知道我需要分两步来完成这项工作:第一步-更新第一行,第二步-基于第一行计算第二行。 我有一个查询,给出了最接近的距离,如下所示:更新postgresql中表的所有行,sql,postgresql,Sql,Postgresql,我将表格的每一行与其他每一行进行比较,以找到最小距离。我还想添加两列,一列称为“最近的距离”,另一列称为“最近的距离”。 我知道我需要分两步来完成这项工作:第一步-更新第一行,第二步-基于第一行计算第二行。 我有一个查询,给出了最接近的距离,如下所示: SELECT DISTINCT ON (a.id) a.id, (SELECT MIN(ST_HausdorffDistance(a.the_geom, b.the_geom)) FROM gridareas A
SELECT DISTINCT ON (a.id)
a.id,
(SELECT
MIN(ST_HausdorffDistance(a.the_geom, b.the_geom))
FROM
gridareas AS b
WHERE
b.id != a.id
)
FROM gridareas AS a;
然而,我不能使用简单的
UPDATE tablename SET colname = expression;
并使用上面的查询作为表达式,因为
ERROR: subquery must return only one column
LINE 5: (SELECT DISTINCT ON (a.id)
另一方面,子查询不能同时返回a.id和MINST_hausdorfdtance
我应该如何继续更新此专栏?这是您想要的吗
update gridareas ga
set (closest_id, closest_dist) =
(select gs2.id, ST_HausdorffDistance(ga.the_geom, ga2.the_geom) as dist, ga2.id
from gridareas ga2
where ga2.id <> ga.id
order by ST_HausdorffDistance(ga.the_geom, ga2.the_geom)
limit 1
);
这是你想要的吗
update gridareas ga
set (closest_id, closest_dist) =
(select gs2.id, ST_HausdorffDistance(ga.the_geom, ga2.the_geom) as dist, ga2.id
from gridareas ga2
where ga2.id <> ga.id
order by ST_HausdorffDistance(ga.the_geom, ga2.the_geom)
limit 1
);
不完全是,但它帮了大忙,谢谢! 这就是解决我问题的方法:
UPDATE
gridareas AS a
SET
(hausdorffdistance_to_closest_geom) =
(SELECT
MIN(ST_HausdorffDistance(a.the_geom, b.the_geom))
FROM
gridareas AS b
WHERE
b.id != a.id
);
不完全是,但它帮了大忙,谢谢! 这就是解决我问题的方法:
UPDATE
gridareas AS a
SET
(hausdorffdistance_to_closest_geom) =
(SELECT
MIN(ST_HausdorffDistance(a.the_geom, b.the_geom))
FROM
gridareas AS b
WHERE
b.id != a.id
);
我认为一些示例数据会很有帮助。什么是id?id是表的主键!_geom是该区域的几何图形,因为这是一个postGIS,但它也与geom无关,它可以被任何int和ST_HausdorfDistance替换为任何其他函数,例如,LEASTI真的认为不应该将该信息保留在表列中。它是冗余的,因此会随着表的更改而腐烂。您应该使用动态计算信息的视图。如果这样一个视图的性能太慢(如果表很大,这似乎不太可能),请使用物化视图并定期刷新它。我认为一些示例数据会非常有用。什么是id?id是表的主键!_geom是该区域的几何图形,因为这是一个postGIS,但它也与geom无关,它可以被任何int和ST_HausdorfDistance替换为任何其他函数,例如,LEASTI真的认为不应该将该信息保留在表列中。它是冗余的,因此会随着表的更改而腐烂。您应该使用动态计算信息的视图。如果这样一个视图的性能太慢(如果表很大,这似乎不太可能),请使用物化视图并定期刷新它。