上周公司市场部的小王跑来求助:"我这有份客户联系表,里面有好多重复记录,能不能帮我把重复的姓名去掉?哦对了,还要给每个客户加个'VIP等级'字段,都先默认设为'普通会员'..."
这不正是SQL去重和字段赋值的经典场景吗?今天我就把SQL Server 2008中处理这类问题的实用方法整理出来,都是实战中验证过的技巧。
-- 基本用法:单字段去重 SELECT DISTINCT 客户姓名 FROM 客户表; -- 多字段组合去重 SELECT DISTINCT 客户姓名, 联系电话 FROM 客户表;
注意:DISTINCT作用于所有SELECT的字段,不是仅对第一个字段有效。
-- 基础分组去重 SELECT 客户姓名 FROM 客户表 GROUP BY 客户姓名; -- 带聚合函数的分组(获取每个客户的最新记录) SELECT 客户姓名, MAX(注册日期) AS 最近注册时间 FROM 客户表 GROUP BY 客户姓名;
优势:可以配合聚合函数获取更丰富的去重结果。
-- 为每组重复记录编号,然后筛选 WITH 去重CTE AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY 客户姓名 ORDER BY 注册日期 DESC) AS 行号 FROM 客户表 ) SELECT 客户姓名, 联系电话, 注册日期 FROM 去重CTE WHERE 行号 = 1;
适用场景:需要保留每组重复记录中的特定一条(如最新记录)。
-- 添加VIP等级字段 ALTER TABLE 客户表 ADD VIP等级 VARCHAR(10); -- 批量赋默认值 UPDATE 客户表 SET VIP等级 = '普通会员'; -- 条件赋值 UPDATE 客户表 SET VIP等级 = '黄金会员' WHERE 消费金额 > 10000;
UPDATE 客户表 SET VIP等级 = CASE WHEN 消费金额 > 20000 THEN '钻石会员' WHEN 消费金额 > 10000 THEN '黄金会员' WHEN 消费金额 > 5000 THEN '白银会员' ELSE '普通会员' END;
UPDATE 客户表 SET VIP等级 = 会员等级表.等级 FROM 客户表 INNER JOIN 会员等级表 ON 客户表.客户ID = 会员等级表.客户ID;
实际工作中经常需要先去重再赋值:
-- 步骤1:创建去重后的临时表 SELECT 客户ID, 客户姓名, 联系电话, MAX(注册日期) AS 注册日期 INTO #临时客户表 FROM 客户表 GROUP BY 客户ID, 客户姓名, 联系电话; -- 步骤2:添加并赋值VIP字段 ALTER TABLE #临时客户表 ADD VIP等级 VARCHAR(10) DEFAULT '普通会员'; -- 步骤3:条件升级VIP UPDATE #临时客户表 SET VIP等级 = '黄金会员' WHERE 客户ID IN (SELECT 客户ID FROM 消费记录 WHERE 年消费额 > 10000);
假设我们要处理一个重复的订单表:
-- 1. 识别重复订单(相同客户同一天的同金额订单) SELECT 客户ID, 订单日期, 订单金额, COUNT(*) AS 重复次数 FROM 订单表 GROUP BY 客户ID, 订单日期, 订单金额 HAVING COUNT(*) > 1; -- 2. 创建去重视图(保留最高订单ID的记录) CREATE VIEW 去重订单视图 AS WITH 编号CTE AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY 客户ID, 订单日期, 订单金额 ORDER BY 订单ID DESC) AS 行号 FROM 订单表 ) SELECT 订单ID, 客户ID, 订单日期, 订单金额 FROM 编号CTE WHERE 行号 = 1; -- 3. 添加订单状态字段并赋值 ALTER TABLE 订单表 ADD 订单状态 VARCHAR(20) DEFAULT '待处理'; -- 4. 为去重后的订单更新状态 UPDATE 订单表 SET 订单状态 = '已核实' WHERE 订单ID IN (SELECT 订单ID FROM 去重订单视图);
SQL Server 2008虽然不算新版本,但这些数据处理方法依然实用,关键是要理解:去重本质是数据分组筛选,赋值则是条件更新,掌握这些核心思路,再结合具体业务需求灵活运用,就能轻松应对各种数据清洗任务。
下次小王再来求助时,我准备教他把这些操作写成存储过程,一键完成从去重到赋值的全流程——不过那就是另一个话题了。
本文由 可夏真 于2025-07-30发表在【云服务器提供商】,文中图片由(可夏真)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/487674.html
发表评论