SQL删除表中的重复记录只保留其中一条,最简单的方法:ROW_NUMBER()

这篇博客介绍了如何使用SQL语句删除表中的重复记录,特别是针对具有相同字段值的情况。通过创建临时表并利用ROW_NUMBER()函数,博主展示了如何保留每个分组中ID最小的记录,从而有效地清理重复数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?.

要求:删除表中多余的重复记录,且保留 id 最小的那一条记录。

CREATE TABLE #temp_data(
id BIGINT PRIMARY KEY IDENTITY,
name NVARCHAR(50),
category INT,--分类id
sort_id INT,--排序id
addtime DATETIME
)

INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果11', 1, 1,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果12', 1, 2,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果23', 2, 3,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果24', 2, 4,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果11', 1, 1,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果12', 1, 2,GETDATE());


--SELECT * FROM #temp_data
--ROW_NUMBER() OVER
SELECT *,(ROW_NUMBER() OVER(ORDER BY name asc,id asc)) as r_index
FROM #temp_data d


--ORDER BY id --如果再写Order by子句,记录会按后面的Order by子句排序

--ROW_NUMBER() OVER PARTITION BY 记录按后面的order BY 子句排序输出,跟ROW_NUMBER方法产生的序号无关。

delete from #temp_data 
where 
id in (
	select id from (
		SELECT (ROW_NUMBER() OVER(PARTITION BY name ORDER BY id Asc)) as r_index,*
		FROM #temp_data
	) X where r_index> 1
) 
and id not in (
	select   min(id) from #temp_data   group  by name having  count(*)> 1
)

1、查找表中多余的重复记录,重复记录是根据单个字段(id)来判断的。

SELECT (ROW_NUMBER() OVER(PARTITION BY name ORDER BY id Asc)) as r_index,* FROM #temp_data

2. group by name 分组,查询count(*)>1的有重复项的min(id)。也就是最原始的,要保留。

select   min(id) from #temp_data   group  by name having  count(*)> 1

3. 删除重复记录,保留 id 最小的那一条记录 ( id not in (min(id))。

查看结果,相同水果的只保留一条记录,成功~ 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值