当存在往返成对记录时仅获取单行数据
处理往返成对行程记录的方案
首先先明确你的原始数据结构和内容:
from To KM Delhi Mumbai 1000 Mumbai Delhi 1000 Gurgaon Noida 50 Noida Gurgaon 50 Ghaziabad Faridabad 60 Faridabad Ghaziabad 60 Delhi Meerut 80 Meerut Delhi 80
你需要保留每对往返行程的唯一记录,这里有两种实用的处理方式,我平时处理这类需求常用这两种:
方法一:统一行程方向后去重
通过字符串排序,把每对行程的起点和终点统一成固定顺序(比如让起点的字符串小于终点),然后分组去重,这样就能得到唯一的行程记录:
SELECT CASE WHEN `from` < `To` THEN `from` ELSE `To` END AS origin, CASE WHEN `from` < `To` THEN `To` ELSE `from` END AS destination, KM FROM your_table GROUP BY origin, destination, KM;
执行后会得到这样的结果:
origin destination KM Delhi Mumbai 1000 Gurgaon Noida 50 Ghaziabad Faridabad 60 Delhi Meerut 80
方法二:用窗口函数标记并筛选唯一记录
这种方法会保留你原始的from和To列值,通过LEAST和GREATEST函数给每对往返行程分配相同的分组键,再给每组加行号,最后筛选出每组的第一行即可:
WITH ranked_routes AS ( SELECT `from`, `To`, KM, ROW_NUMBER() OVER ( PARTITION BY LEAST(`from`, `To`), GREATEST(`from`, `To`) ORDER BY `from` ) AS rn FROM your_table ) SELECT `from`, `To`, KM FROM ranked_routes WHERE rn = 1;
执行后会得到类似这样的结果(保留原始其中一条记录):
from To KM Delhi Mumbai 1000 Gurgaon Noida 50 Ghaziabad Faridabad 60 Delhi Meerut 80
如果你的数据中往返里程可能存在差异(你当前的数据都是一致的),还可以调整分组后的聚合逻辑,比如用AVG(KM)取平均里程,或者MAX(KM)取最大里程,根据实际需求来就行。
内容的提问来源于stack exchange,提问作者Anurag Narayan
相关产品推荐
相关产品推荐

