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

SQL如何按指定列筛选、去重电话号码重复数据并标记重复项

报错原因
  • 你写的CASE语句语法不完整:case when cc."PhoneNumber" is not null count(cc."PhoneNumber") else 0 缺少THEN关键字,且聚合函数COUNT不能直接在非分组的普通查询字段中使用
  • 未声明GROUP BY子句的前提下直接使用聚合函数COUNT()和HAVING过滤,不符合SQL语法规范
实现方案

你可以使用窗口函数同时完成「手机号去重」和「重复标记」的需求,以下是适配PostgreSQL的正确写法:

WITH phone_stat AS (
    SELECT 
        cc.id,
        cc."FirstName",
        cc."LastName",
        cc."PhoneNumber" AS phone_number,
        cc."CreationDate",
        -- 标记重复:同手机号出现次数>1则标1,否则标0
        CASE WHEN COUNT(*) OVER (PARTITION BY cc."PhoneNumber") > 1 THEN 1 ELSE 0 END AS duplicate_flag,
        -- 给同手机号的记录按id排序,取第一条即可去重
        ROW_NUMBER() OVER (PARTITION BY cc."PhoneNumber" ORDER BY cc.id ASC) AS rn
    FROM souscritootest.public.clients_crm cc
)
SELECT 
    id,
    "FirstName",
    "LastName",
    phone_number,
    "CreationDate",
    duplicate_flag
FROM phone_stat
WHERE rn = 1 -- 每个手机号仅保留id最小的1条记录
ORDER BY id ASC;
  • 公用表表达式phone_stat先给所有记录做两个标记:duplicate_flag用来标识该手机号是否重复,rn用来给同一个手机号的记录按id升序排序
  • 外层查询过滤rn=1即可实现每个手机号仅保留一条记录,和你给出的预期输出结果一致
  • 如果不需要去重只需要加重复标记,去掉外层的WHERE rn=1条件即可

内容的提问来源于stack exchange,提问作者user13450387

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:39:03