You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指定列值删除重复数据: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:42:06