我们遇到了一个意外,即多个具有重复值的行被插入到表中,我需要找到哪些行采用相当特定的格式。到目前为止,我有这样的查询:
SELECT p2.id
FROM assignmentobject p1, assignmentobject p2
WHERE ST_Equals(p1.the_geom, p2.the_geom) AND
p1.id <> p2.id and p1.assignmentid = 15548
group by p1.id, p2.id
比较行的几何形状,如果相同则将其吐出。 ID 是主键,并且是按顺序创建的。
但是,这提出了一个问题,正如结果的这一小部分所示:
p1.id p2.id
35311 35314
35311 35315
35314 35311
35314 35315
35315 35311
35315 35314
从这里可以看出,35311、35314 和 35315 具有相同的几何形状,因此,它们之间的所有组合都包含在结果中。我的目标是使用最低或最高的 ID 作为“基础”,并忽略不涉及此“基础”的其他组合。即,上面显示的结果将是:
p1.id p2.id
35311 35314
35311 35315
此处,31314 和 35315 之间的组合被省略。使用纯 SQL 可以实现吗?
最佳答案
只需更改 <>
运算符至<
WHERE ST_Equals(p1.the_geom, p2.the_geom) AND
p1.id < p2.id and p1.assignmentid = 15548
如果分配ID重复并且您希望一次获得所有重复项
select p2.id
from
assignmentobject p1
inner join
assignmentobject p2 using(assigmentid)
where
st_equals(p1.the_geom, p2.the_geom) and
p1.id < p2.id
group by p1.id, p2.id
关于sql - 在 Postgres 中查找多个重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18769250/