如何在SQL中筛选C1、C2、C3组合唯一的行?
筛选C1/C2/C3组合唯一的行
原数据表
| C1 | C2 | C3 | C4 | r1 | a | b | c | 1 | r2 | a | b | c | 2 | r3 | c | s | d | 3 | r4 | c | w | w | 4 | r5 | c | r | w | 5 |
需求说明
需要删除所有C1、C2、C3列组合存在重复的行,仅保留该组合唯一的记录,最终结果如下:
| C1 | C2 | C3 | C4 | r3 | c | s | d | 3 | r4 | c | w | w | 4 | r5 | c | r | w | 5 |
解决方案
推荐两种实用方法,适配不同数据库环境:
方法1:窗口函数(推荐,支持现代数据库)
利用COUNT()窗口函数统计每个C1/C2/C3分组的记录数,直接筛选出分组内仅一条记录的行:
WITH grouped_data AS ( SELECT *, COUNT(*) OVER (PARTITION BY C1, C2, C3) AS group_count FROM your_table_name ) SELECT C1, C2, C3, C4 FROM grouped_data WHERE group_count = 1;
方法2:子查询关联(兼容低版本数据库)
先统计每个组合的记录数,再关联原表筛选符合条件的行:
SELECT t1.C1, t1.C2, t1.C3, t1.C4 FROM your_table_name t1 INNER JOIN ( SELECT C1, C2, C3 FROM your_table_name GROUP BY C1, C2, C3 HAVING COUNT(*) = 1 ) t2 ON t1.C1 = t2.C1 AND t1.C2 = t2.C2 AND t1.C3 = t2.C3;
内容的提问来源于stack exchange,提问作者Mohit S
相关产品推荐
相关产品推荐

