SQL删除重复数据

//先创建一个测试表
CREATE TABLE [dbo].[test](
	[name] [nvarchar](50) NOT NULL,
	[age] [int] NOT NULL
) ON [PRIMARY]
GO

//插入测试
INSERT INTO [dbo].[test] VALUES('张三',38)
INSERT INTO [dbo].[test] VALUES('张三',38)
INSERT INTO [dbo].[test] VALUES('李四',43)
INSERT INTO [dbo].[test] VALUES('李四',43)
INSERT INTO [dbo].[test] VALUES('王五',55)
GO

解决方案:

  1. 无唯一标识列
    使⽤ROW_NUMBER()函数删除重复记录,根据每个人数据重复的规则进行分组(Partition By),我这边是以name和age去判断数据是否重复,order by后面随便跟一个字段即可,根据重复的数据进行编号。
SELECT Row_Number() OVER(PARTITION BY name, age ORDER BY name) AS RowNumber,* FROM test

SQL运行结果:
从结果可以看出,RowNumber已经根据你的分组,将每组数据进行编号。
在这里插入图片描述
最后将RowNumber大于1的进行Delete。

DELETE T FROM
 (SELECT Row_Number() OVER(PARTITION BY name, age ORDER BY name) AS RowNumber,* FROM test)T
WHERE T.RowNumber > 1
  1. 有唯一标识列
    使用HAVING()函数
    把test表进行修改,添加id唯一标识列,新表数据如下:
    在这里插入图片描述
    SQL运行结果:
    使用HAVING()函数,根据分组用COUNT求每组数量,大于1个的即为重复数据,再根据id取最大或最小,我这边是取最大。
SELECT MAX(ID) FROM Student GROUP BY name, age HAVING COUNT(*) > 1

在这里插入图片描述
得到重复的id后,根据id进行Delete。

DELETE FROM test
WHERE id NOT IN(SELECT MAX(ID) FROM Student GROUP BY name, age HAVING COUNT(*) > 1)
  1. 使用临时表(适用于数据量不大的情况)
//先将去重后的数据放入临时表内
SELECT DISTINCT name, age INTO #temp_test FROM test

//再将正式表内数据清空
DELETE FROM test

//最后把临时表数据导入正式表中
INSERT * INTO test SELECT * FROM #temp_test
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值