SQL实现:过滤同一ID对应的重复名称
数据表去重查询方案
原始数据
| ID | Name |
|---|---|
| 1 | name_1 |
| 2 | name_2 |
| 3 | name_3 |
| 4 | name_4 |
| 1 | other_name_1 |
| 2 | other_name_2 |
| 5 | name_5 |
需求说明
部分ID对应多个Name值,需将other_name_1和other_name_2视为重复数据,查询得到无重复的ID和Name集合,期望输出如下:
期望结果
| ID | Name |
|---|---|
| 1 | name_1 |
| 2 | name_2 |
| 3 | name_3 |
| 4 | name_4 |
| 5 | name_5 |
可行SQL查询方法
方法1:优先保留非"other_"前缀的名称
通过分组和条件判断,为每个ID优先选取不是other_开头的Name,若该ID只有other_开头的名称则保留:
SELECT ID, CASE WHEN EXISTS (SELECT 1 FROM your_table t2 WHERE t2.ID = t1.ID AND t2.Name NOT LIKE 'other_%') THEN MAX(CASE WHEN Name NOT LIKE 'other_%' THEN Name END) ELSE MAX(Name) END AS Name FROM your_table t1 GROUP BY ID;
方法2:排序后取优先级最高的记录
利用窗口函数给非other_前缀的Name赋予更高优先级(排序值为0),然后为每个ID取第一条记录:
SELECT ID, Name FROM ( SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY CASE WHEN Name LIKE 'other_%' THEN 1 ELSE 0 END) AS rn FROM your_table ) t WHERE rn = 1;
方法3:直接过滤指定重复值
如果仅针对other_name_1和other_name_2这两个特定值做过滤,可以用UNION组合结果:
SELECT ID, Name FROM your_table WHERE Name NOT IN ('other_name_1', 'other_name_2') UNION SELECT ID, Name FROM your_table WHERE ID NOT IN (SELECT ID FROM your_table WHERE Name IN ('other_name_1', 'other_name_2'));
内容的提问来源于stack exchange,提问作者DanteeChaos
相关产品推荐
相关产品推荐

