SQL识别删除表中手机号重复数据时count语法错误如何解决
报错原因
- 语法错误:
CASE WHEN语句结构不完整,标准语法为CASE WHEN 判断条件 THEN 返回值 ELSE 其他返回值 END,你的代码中缺失THEN关键字,也没有END闭合语句,直接触发语法报错。 - 逻辑错误:聚合函数
COUNT()需要搭配GROUP BY指定分组维度才能正常使用,你当前代码未指定分组规则,HAVING的筛选逻辑也无法实现「每个手机号保留一条记录」的需求。
正确实现代码
使用窗口函数可以同时实现手机号去重、新增重复标记的需求,代码如下:
WITH client_rank AS ( SELECT cc.id, cc."FirstName", cc."LastName", cc."PhoneNumber" AS phone_number, cc."CreationDate", -- 统计同手机号的总记录数,用于判断是否重复 COUNT(*) OVER(PARTITION BY cc."PhoneNumber") AS phone_total, -- 同手机号按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", -- 标记重复:同手机号总记录数>1则标1,否则标0 CASE WHEN phone_total > 1 THEN 1 ELSE 0 END AS is_duplicate FROM client_rank -- 每个手机号仅保留排序为1的一条记录 WHERE rn = 1;
如果需要按创建日期保留最新的记录,只需将ROW_NUMBER()的排序规则改为ORDER BY cc."CreationDate" DESC即可。
内容的提问来源于stack exchange,提问作者morzilla
相关产品推荐
相关产品推荐

