基于几何列选择重复项

4
我遇到了一个比较棘手的问题。我需要基于几何形状(有些人在复制和粘贴时没有意识到重复使用相同的几何形状)选择SQL空间表中的所有重复项。
我需要选择除具有相同几何形状的最低ID之外的所有重复项。

你能提供当前数据和期望输出的样例吗? - hugovicfortman
5个回答

3
您可以将表格与自身连接,并使用STEquals函数进行检查。
SELECT tbl1.OBJECTID, tbl2.OBJECTID
FROM your_table tbl1
JOIN yout_table tbl2 ON tbl1.your_geometry_field.STEquals(tbl2.your_geometry_field) = 1
WHERE tbl1.OBJECTID <> tbl2.OBJECTID
ORDER BY tbl1.OBJECTID

1
你可以添加 WHERE tbl1.OBJECTID <> tbl2.OBJECTID 来确保记录不会互相比较。 - geographika

0

这将给你所有的重复项。

WITH C AS(
    SELECT  ROW_NUMBER() OVER (PARTITION BY CAST(your_geometry_field AS VARBINARY(MAX)) 
                               ORDER BY CAST(your_geometry_field AS VARBINARY(MAX)) AS Rn
    FROM your_table
)
SELECT * FROM C WHERE Rn != 1

如果您提供包含表定义和样本数据的问题,我将会更新答案并提供详细解释。 - sqluser
太好了,我会尝试一下。明天我会发送一个样例 :D - Trent Thompson
这是行不通的,因为在SQL Server中几何图形是不可比较的。 - andyb
你是正确的 @andyb。将它转换为 VARBINARY(MAX) 怎么样? - sqluser
1
这听起来是个不错的主意,@sqluser。但是当我尝试这样做时,很快就会变得非常复杂,需要使用CTE和STEquals()等函数。我已经在几个点上进行了测试,将其转换为varbinary似乎非常有效。然而,STEquals在几何意义上相等(例如覆盖相同区域)时返回true,但它们可能不是二进制相等。但这绝对是一个有趣的想法。 - andyb

0
请尝试以下代码片段。
SELECT tbl1.id, tbl2.id
FROM HEXA_GRID_SP tbl1,
HEXA_GRID_SP tbl2 
where SDO_EQUAL(tbl1.geometry,tbl2.geometry) = 'TRUE';

0

针对您的第一个问题:在名为“TableName”的表中,有一个名为“CenterPoint”的空间点列。以下代码按位置对中心点进行分组,如果计数大于1,则表示存在重复项:

    SELECT ID, COUNT(CenterPoint)
    FROM TableName
    GROUP BY CenterPoint
    HAVING COUNT(CenterPoint) > 1

由于在SQL服务器中几何列不可比较,因此您无法按几何列分组。 - digz6666

0

我最近使用了这些方法

SELECT DISTINCT(T1.Id)
FROM table T1, table T2
WHERE T1.Shape.STEquals(T2.Shape) > 0
AND T1.Id <> T2.Id
ORDER BY Id

这样,您可以使用空间关系来查找重复项。

另一种方法是使用典型的 SQL GROUP BY,使用几何图形的文本。

SELECT Id, Shape.STAsText(), COUNT(*) Duplicates
FROM table
GROUP BY Id, Shape.STAsText()
HAVING COUNT(*) > 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接