当前位置:首页 > 问答 > 正文

SQL去重 字段赋值 SQL Server 2008学习笔记之中心词去重与新增字段赋值方法

SQL去重与字段赋值:SQL Server 2008实战笔记

场景引入:数据清洗的烦恼

上周公司市场部的小王跑来求助:"我这有份客户联系表,里面有好多重复记录,能不能帮我把重复的姓名去掉?哦对了,还要给每个客户加个'VIP等级'字段,都先默认设为'普通会员'..."

这不正是SQL去重和字段赋值的经典场景吗?今天我就把SQL Server 2008中处理这类问题的实用方法整理出来,都是实战中验证过的技巧。

SQL去重三大招

DISTINCT简单去重

-- 基本用法:单字段去重
SELECT DISTINCT 客户姓名 FROM 客户表;
-- 多字段组合去重
SELECT DISTINCT 客户姓名, 联系电话 FROM 客户表;

注意:DISTINCT作用于所有SELECT的字段,不是仅对第一个字段有效。

SQL去重 字段赋值 SQL Server 2008学习笔记之中心词去重与新增字段赋值方法

GROUP BY分组去重(更灵活)

-- 基础分组去重
SELECT 客户姓名 
FROM 客户表
GROUP BY 客户姓名;
-- 带聚合函数的分组(获取每个客户的最新记录)
SELECT 客户姓名, MAX(注册日期) AS 最近注册时间
FROM 客户表
GROUP BY 客户姓名;

优势:可以配合聚合函数获取更丰富的去重结果。

ROW_NUMBER()窗口函数(高级去重)

-- 为每组重复记录编号,然后筛选
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;

使用CASE WHEN智能赋值

UPDATE 客户表
SET VIP等级 = 
    CASE 
        WHEN 消费金额 > 20000 THEN '钻石会员'
        WHEN 消费金额 > 10000 THEN '黄金会员'
        WHEN 消费金额 > 5000 THEN '白银会员'
        ELSE '普通会员'
    END;

基于其他表数据赋值

UPDATE 客户表
SET VIP等级 = 会员等级表.等级
FROM 客户表
INNER JOIN 会员等级表 ON 客户表.客户ID = 会员等级表.客户ID;

去重+赋值的组合拳

实际工作中经常需要先去重再赋值:

SQL去重 字段赋值 SQL Server 2008学习笔记之中心词去重与新增字段赋值方法

-- 步骤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. 去重陷阱:DISTINCT对NULL值也有效,NULL会被视为相同值
  2. 性能注意:大数据量表去重时,考虑先创建索引
  3. 事务安全:重要数据操作前先BEGIN TRANSACTION,确认无误再COMMIT
  4. 备份习惯:UPDATE前先SELECT确认条件是否正确

实战案例

假设我们要处理一个重复的订单表:

-- 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虽然不算新版本,但这些数据处理方法依然实用,关键是要理解:去重本质是数据分组筛选,赋值则是条件更新,掌握这些核心思路,再结合具体业务需求灵活运用,就能轻松应对各种数据清洗任务。

下次小王再来求助时,我准备教他把这些操作写成存储过程,一键完成从去重到赋值的全流程——不过那就是另一个话题了。

SQL去重 字段赋值 SQL Server 2008学习笔记之中心词去重与新增字段赋值方法

发表评论