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

SQL中移除两Char类型列的无序重复组合技术咨询

解决两列无序组合去重的问题

嘿,这个需求我太熟了!本质就是要对两个字符列的组合做无序去重——也就是把(str_1, str_2)和(str_2, str_1)这类仅顺序不同的重复记录只保留一条。下面给你几种适配不同数据库的实用方案:

方法1:基于有序组合直接去重(最简单通用)

核心思路是把两列转换成一个固定顺序的组合(比如字典序小的在前,大的在后),再用DISTINCT去重。

MySQL / PostgreSQL 版本

SELECT DISTINCT
    LEAST(Col_1, Col_2) AS Col_1,
    GREATEST(Col_1, Col_2) AS Col_2
FROM your_table;

LEAST()会返回两列中字典序更小的值,GREATEST()返回更大的,这样不管原记录顺序如何,都会统一成同一个组合,再去重就得到你要的结果。

SQL Server 版本(无LEAST/GREATEST函数)

用CASE语句实现同样的逻辑:

SELECT DISTINCT
    CASE WHEN Col_1 <= Col_2 THEN Col_1 ELSE Col_2 END AS Col_1,
    CASE WHEN Col_1 <= Col_2 THEN Col_2 ELSE Col_1 END AS Col_2
FROM your_table;

方法2:保留原记录顺序(而非强制排序后的组合)

如果你想保留原表中某一条特定的记录(比如第一次出现的那条),而不是统一成排序后的组合,可以用窗口函数:

WITH ranked_records AS (
    SELECT
        Col_1,
        Col_2,
        -- 按无序组合分组,给每组记录编号
        ROW_NUMBER() OVER (
            PARTITION BY LEAST(Col_1, Col_2), GREATEST(Col_1, Col_2)
            ORDER BY your_primary_key -- 这里可以替换成你想保留的规则,比如创建时间、主键等
        ) AS rn
    FROM your_table
)
SELECT Col_1, Col_2
FROM ranked_records
WHERE rn = 1;

把your_primary_key换成你表中的主键或者时间字段,就能指定保留每组中的哪一条记录。

验证你的示例

针对你给出的输入数据:

输入数据:

Col_2
str_2
str_1
str_3
str_4
str_2

用方法1处理后,输出结果完全符合你的要求:

输出数据:

Col_2
str_2
str_3
str_4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 17:32:29