繁体   English   中英

删除查询结果集中的重复项集群

[英]Removing clusters of duplicates in a query resultset

我有以下查询,返回以下结果:

db=# SELECT t1.id as id1, t2.id as id2
db-#  FROM table_1 As t1, table_2 As t2
db-#  WHERE ST_DWithin(t2.lonlat, t1.lonlat, t2.range)
db-#  ORDER BY t1.id, t2.id, ST_Distance(t2.lonlat, t1.lonlat);
  id1  | id2  
-------+------
  4499 | 1118
  4500 | 1118
  4501 | 1119
  4502 | 1119
  4503 | 1118
  4504 | 1118
  4505 | 1119
  4506 | 1119
  4507 | 1118
  4508 | 1118
  4510 | 1118
  4511 | 1118
  4514 | 1117
  4515 | 1117
  4518 | 1117
  4519 | 1117
  4522 | 1117
  4523 | 1117
  4603 | 1116
  4604 | 1116
  4607 | 1116

我希望结果集如下所示:

  id1  | id2  
-------+------
  4499 | 1118
  4501 | 1119
  4503 | 1118
  4505 | 1119
  4507 | 1118
  4514 | 1117
  4603 | 1116

本质上,在结果中,查询返回的是id2重复项,但是id2在结果中出现多次是可以的,但是如果id2在集群中重复,则不是可以的。

这里的用例是id1代表一个GPS位置表的ID,而id2代表一个路点表,我想查询一个返回最接近的通行点到任何路点的查询(因此,如果传递了路点#1118,那么只有在传递另一个航点之前,它才能再次传递)。

有没有办法使用Postgres做到这一点?

这是一个鸿沟问题,但相当微妙。 在这种情况下,只需要上一行具有不同id2行。 这建议使用LAG()

SELECT id1, id2
FROM (SELECT tt.*, LAG(id2) OVER (ORDER BY id1, id2, dist) as prev_id2
      FROM (SELECT t1.id as id1, t2.id as id2,
                   ST_Distance(t2.lonlat, t1.lonlat) as dist
            FROM table_1 t1 JOIN
                 table_2 t2
                 ON ST_DWithin(t2.lonlat, t1.lonlat, t2.range)
           ) tt
     ) tt
WHERE prev_id2 is distinct from id2
ORDER BY id1, id2, dist;

注意:我认为所提供的逻辑可以简化,因为id1似乎是唯一的。 因此,距离计算似乎完全是多余的。 我保留了该逻辑,因为它可能与您的实际查询有关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM