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

如何在SQL中仅对单列去重并查询多列(特殊需求)

解决按手机号去重并忽略用户名差异的SQL查询问题

问题分析

你需要实现的核心需求:

  • 查询buyer_name和phone_number两列
  • 仅对phone_number去重,忽略buyer_name的拼写、大小写差异
  • 为phone_number添加国家码62

之前的尝试存在两个关键问题:

  1. 单独对某列使用DISTINCT属于语法错误——SQL中DISTINCT是作用于整个结果集的,不能仅修饰单个字段
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:32:33