sql - 在 Postgres 中查找多个重复项

标签 sql postgresql duplicates

我们遇到了一个意外,即多个具有重复值的行被插入到表中,我需要找到哪些行采用相当特定的格式。到目前为止,我有这样的查询:

    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/

相关文章:

sql - 在 postgresql 中生成系列时获得部分周数

sql - 发布 postgresql 扩展

php - PostgreSQL:在特定数据库中创建模式 [NOT psql]

R:名称相同时在行中求和值

mysql - 在 MySQL 中,当没有唯一字段(主键)时,如何编写查询以在插入时跳过重复行?

sql - 使用递归 CTE 处理日期逻辑

SQL Server 计划 : difference between Index Scan/Index Seek

sql - 更新以从逗号分隔列表中删除重复项

c# - 如何在 Microsoft Visual Studio 2012 中使用本地数据库文件添加/编辑/检索数据

sql - 选择可能只有多个值的列中只有一个值的记录