如何在SQL中仅对单列去重并查询多列(特殊需求)
解决按手机号去重并忽略用户名差异的SQL查询问题
问题分析
你需要实现的核心需求:
- 查询
buyer_name和phone_number两列 - 仅对
phone_number去重,忽略buyer_name的拼写、大小写差异 - 为
phone_number添加国家码62
之前的尝试存在两个关键问题:
- 单独对某列使用
DISTINCT属于语法错误——SQL中DISTINCT是作用于整个结果集的,不能仅修饰单个字段 SELECT DISTINCT会将buyer_name和phone_number的组合作为唯一判定条件,因此同一手机号对应不同用户名时,会被保留为多行
解决方案
以下两种方式可实现需求,适配不同数据库场景:
方法1:使用GROUP BY分组
按phone_number分组,选择每个分组下任意一个buyer_name(可根据需求选择取第一个出现的、字符串最小/最大值),同时拼接国家码:
SELECT ANY_VALUE(buyer_name) AS buyer_name, CONCAT('62', phone_number) AS phone_number FROM your_table_name GROUP BY phone_number;
注:
ANY_VALUE()适用于MySQL,用于返回分组内任意非聚合值;如果是PostgreSQL等数据库,可替换为MIN(buyer_name)或MAX(buyer_name)来固定取某一个用户名。
方法2:使用窗口函数(支持窗口函数的数据库)
通过ROW_NUMBER()窗口函数按phone_number分组排序,取每组的第一行:
WITH ranked_data AS ( SELECT buyer_name, CONCAT('62', phone_number) AS phone_number, ROW_NUMBER() OVER (PARTITION BY phone_number ORDER BY buyer_name) AS rn FROM your_table_name ) SELECT buyer_name, phone_number FROM ranked_data WHERE rn = 1;
ORDER BY buyer_name可按需调整排序规则,比如按数据插入时间排序,确保取到特定的用户名。
测试验证
以你提供的样例数据测试:
样例输入:
buyer_name phone_number Doni 6281234567 sofia 6281234568 Sofia 6281234568 Sophia 6281234568
执行上述SQL后,将得到期望结果:
buyer_name phone_number Doni 626281234567 sofia 626281234568
注:若你的原始
phone_number已包含国家码62,可去掉CONCAT('62', ...)中的62,直接使用phone_number即可。
内容的提问来源于stack exchange,提问作者Dimas Triaji
相关产品推荐
相关产品推荐

