SQL如何实现两列双向拼接去重并保留第三列较大值记录?
SQL双向字段匹配去重方案
核心实现思路是通过固定两列的排序规则生成全局唯一的去重标识,解决两列顺序互换即判定重复的需求,再按组筛选出第三列值最大的行即可。
- 去重标识生成规则:对每行的
column_one、column_two两个字段,统一将值更小的字段放在前、值更大的字段放在后拼接,这样无论两列顺序如何调换,同一对字段值生成的去重标识完全一致,符合重复判定规则。 - 保留规则实现:按生成的去重标识分组,每组内仅保留
column_three取值最大的行。
支持窗口函数的数据库写法(MySQL 8.0+、PostgreSQL、SQL Server、Oracle等)
用CTE+窗口函数实现逻辑最清晰,性能也更好:
WITH temp_ranked AS ( SELECT column_one, column_two, column_three, ROW_NUMBER() OVER ( PARTITION BY LEAST(column_one, column_two), GREATEST(column_one, column_two) ORDER BY column_three DESC ) AS group_rank FROM your_original_query_result -- 替换成你自己的原表名,或者嵌套你原来的SQL查询 ) SELECT column_one, column_two, column_three FROM temp_ranked WHERE group_rank = 1;
老版本MySQL(5.x及以下,不支持窗口函数)写法
用分组聚合+关联查询实现相同效果:
SELECT t1.column_one, t1.column_two, t1.column_three FROM your_original_query_result t1 JOIN ( SELECT LEAST(column_one, column_two) AS min_col, GREATEST(column_one, column_two) AS max_col, MAX(column_three) AS max_val FROM your_original_query_result GROUP BY min_col, max_col ) t2 ON LEAST(t1.column_one, t1.column_two) = t2.min_col AND GREATEST(t1.column_one, t1.column_two) = t2.max_col AND t1.column_three = t2.max_val;
注意:如果同一组重复数据里存在多条
column_three同为最大值的记录,上述写法会返回所有同最大值的行;如果该场景下仅需保留任意一条,可根据业务需求调整排序规则增加排序维度,确保每组内仅返回一条记录即可。
内容的提问来源于stack exchange,提问作者HK1
相关产品推荐
相关产品推荐

