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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:18:30