基于指定列值删除重复数据:SQL临时表#temp去重需求
嘿,针对你要基于Tariff_Value列清理临时表#temp重复数据的需求,我整理了几个实用的SQL方案,结合你提供的测试数据来演示:
先确认测试环境
首先把你给出的测试数据SQL整理成可直接运行的代码块,我还额外加了一条重复数据方便演示去重效果:
CREATE TABLE #temp ( [acctnumber] varchar(50), [Premnumber] varchar(50), x varchar(5), y varchar(5), z varchar(5), w varchar(5), [Tariff_value] varchar(50) ) INSERT INTO #temp VALUES ('1234228','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme') INSERT INTO #temp VALUES ('1234228','234233','x','y','z','w','RATE 2M SM GEN SVC sdfu...') -- 新增一条重复的Tariff_Value记录用于测试 INSERT INTO #temp VALUES ('1234228','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
方法1:使用ROW_NUMBER()窗口函数(推荐,灵活可控)
这种方法能精准控制保留哪一条重复数据(比如最早/最晚插入的,或按其他列排序),兼容SQL Server等主流数据库:
-- 用CTE给每组Tariff_Value的记录分配行号 WITH CTE_Duplicates AS ( SELECT *, -- 按Tariff_Value分组,同一组内可指定排序规则决定保留哪条 ROW_NUMBER() OVER (PARTITION BY Tariff_value ORDER BY (SELECT NULL)) AS RowNum FROM #temp ) -- 删除行号大于1的重复记录 DELETE FROM CTE_Duplicates WHERE RowNum > 1;
小提示:ORDER BY (SELECT NULL)表示随机保留一条;如果要保留特定记录,把(SELECT NULL)换成目标列即可,比如ORDER BY acctnumber DESC保留账号更大的那条
方法2:使用DELETE JOIN(适合简单场景)
如果只需要保留每组重复数据中的任意一条,自连接的方式更简洁:
DELETE t1 FROM #temp t1 JOIN #temp t2 ON t1.Tariff_value = t2.Tariff_value AND t1.acctnumber > t2.acctnumber -- 用acctnumber区分,确保只删除其中一条
注意:如果表中有唯一ID列,用ID列替代acctnumber会更准确
方法3:创建新表替换原表(适合数据量不大的情况)
如果不想直接修改原表数据,可以先生成去重后的新表再替换:
-- 生成去重后的临时表 SELECT DISTINCT * INTO #temp_Deduplicated FROM #temp; -- 删除原临时表 DROP TABLE #temp; -- 重命名新表为原表名 EXEC sp_rename '#temp_Deduplicated', '#temp';
说明:这种方法简单直观,但如果原表有索引或约束,需要重新创建
内容的提问来源于stack exchange,提问作者Gowtham Ramamoorthy
相关产品推荐
相关产品推荐

