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
相关产品推荐
相关产品推荐

