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

Sql 删除查询结果集中重复的群集,sql,postgresql,Sql,Postgresql,我有以下查询返回以下结果: 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 |

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

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()


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

非常感谢-我这边有几个注释:1<代码>id1确实是唯一的;2.距离计算很重要,因为我希望得到最近的通过点,而不是第一个通过点-因此,例如,如果到一个航路点(表2)的距离为10米,那么GPS(表1)可能在距离上有记录:10米,然后是6、4、2、1、3、7、9,我希望记录在表1中,距离航路点1m。这会影响你的答案吗?@AlexCrooks。您按
id1、id2
订购。我认为距离并没有被考虑在内。在任何情况下,
lag()
中的
order by
都应该与您真正想要的
order by
匹配。
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;