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
相关产品推荐
相关产品推荐

