You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写SQL查询去除Source与Destination互为反向的重复行?

解决双向行程路线的去重查询问题

原始数据

你的travel details表数据如下:

SourceDestinationDistance
MumbaiHyderabad100
HyderabadMumbai100

需求是筛选出互为反向的路线中仅一行结果,比如保留Mumbai -> Hyderabad这一条。


解决方案

方法1:利用字符串排序筛选(最简方案)

通过比较出发地和目的地的字典序,只保留出发地字典序小于目的地的行,直接排除反向重复:

SELECT Source, Destination, Distance
FROM `travel details`
WHERE Source < Destination

方法2:统一标准化路线方向

如果希望不管原始数据的方向,都统一将字典序小的作为出发地、大的作为目的地,同时自动去重,可以用LEAST和GREATEST函数配合分组:

SELECT 
  LEAST(Source, Destination) AS Source,
  GREATEST(Source, Destination) AS Destination,
  Distance
FROM `travel details`
GROUP BY 
  LEAST(Source, Destination), 
  GREATEST(Source, Destination), 
  Distance

这个方案适合存在多条同路线重复数据的场景,分组后能确保唯一结果。

方法3:自连接排除反向行(灵活控制保留方向)

如果需要优先保留原始数据中某一特定方向的记录,同时兼容没有反向路线的单行数据,可以使用自连接:

SELECT t1.Source, t1.Destination, t1.Distance
FROM `travel details` t1
LEFT JOIN `travel details` t2
  ON t1.Source = t2.Destination AND t1.Destination = t2.Source
WHERE t1.Source < t2.Source OR t2.Source IS NULL

当存在反向记录时,只保留Source字典序更小的那一行;当没有反向记录时,正常返回原行。


内容的提问来源于stack exchange,提问作者DIP

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:45:13