2

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

    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 来实现吗?

4

2 回答 2

1

只需将<>运营商更改为<

WHERE ST_Equals(p1.the_geom, p2.the_geom) AND
p1.id < p2.id and p1.assignmentid = 15548

如果 assignmentid 重复并且您想要一次所有重复项

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
于 2013-09-12T16:18:30.027 回答
1
CREATE TABLE pair (
        ll INTEGER NOT NULL
        , rr INTEGER NOT NULL
        , PRIMARY KEY (ll , rr)
        ) ;

INSERT INTO pair (ll,rr) VALUES
(35311,35314) ,(35311,35315)
,(35314,35311) ,(35314,35315)
,(35315,35311) ,(35315,35314)
        ;

SELECT p1.ll AS p1, p1.rr AS p2
FROM pair p1
WHERE p1.ll < p1.rr -- tie breaker
AND NOT EXISTS (
        SELECT * FROM pair nx
        WHERE nx.ll < nx.rr
        AND nx.rr = p1.ll
        )
        ;

与打包到 CTE 中的原始地理查询相同:

WITH pair AS (
  SELECT p1.id AS ll
       , p2.id AS rr
  FROM assignmentobject p1
  JOIN assignmentobject p2 ON ST_Equals(p1.the_geom, p2.the_geom)
                          -- not sure if you want this ...
                          AND p1.assignmentid = p2.assignmentid 
  WHERE p1.id <> p2.id and p1.assignmentid = 15548
  -- group by seems to make no sense here
  -- group by p1.id, p2.id
   )                                                      
SELECT pp.ll AS p1, pp.rr AS p2
FROM pair pp
WHERE pp.ll < pp.rr -- tie breaker
AND NOT EXISTS (
        SELECT * FROM pair nx
        WHERE nx.ll < nx.rr
        AND nx.rr = pp.ll
        )
        ;
于 2013-09-12T16:30:19.993 回答