如何编写SQL查询去除Source与Destination互为反向的重复行?
解决双向行程路线的去重查询问题
原始数据
你的travel details表数据如下:
| Source | Destination | Distance |
|---|---|---|
| Mumbai | Hyderabad | 100 |
| Hyderabad | Mumbai | 100 |
需求是筛选出互为反向的路线中仅一行结果,比如保留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
相关产品推荐
相关产品推荐

