MS SQLSERVER删除重复数据且只保留一条

背景:

表Per_CheckIn,主要字段:pid--身份证号,checktime-刷身份证时间,由于误操作,导致了重复记录产生,现需将pid和checktime一样的记录删除。

具体表结构:

CREATE TABLE [Per_CheckIn](
	[id] [INT] IDENTITY(1,1) NOT NULL,
	[pid] [CHAR](18) NULL,
	[pname] [NVARCHAR](32) NULL,
	[nation] [NVARCHAR](30) NULL,
	[addr] [NVARCHAR](150) NULL,
	[checktime] [DATETIME] NULL,
	[uptime] [DATETIME] NULL,
	[Birthday] [DATETIME] NULL,
	[StartDate] [DATETIME] NULL,
	[EndDate] [DATETIME] NULL,
	[Organ] [NVARCHAR](500) NULL,
	[Photo] [NTEXT] NULL
)

思路:

1.将重复记录导入临时表#tmp:

 SELECT IDENTITY( INT,1,1 ) AS id,
        [pid],
        [pname],
        [nation],
        [addr],
        [checktime],
        [uptime],
        [Birthday],
        [StartDate],
        [EndDate],
        [Organ],
        [Photo]
 INTO   #tmp
 FROM   [Per_CheckIn]
 WHERE  pid IN ( SELECT pid
                 FROM   [Per_CheckIn]
                 GROUP BY pid,
                        checktime
                 HAVING COUNT(*) > 1 )
 ORDER BY pid,checktime; 

2.删除[Per_CheckIn]表中重复的记录:

 DELETE FROM [Per_CheckIn]
 WHERE  pid IN ( SELECT pid
                 FROM   [Per_CheckIn]
                 GROUP BY pid,checktime
                 HAVING COUNT(*) > 1 );

3.给重复数据一个自增ID,过滤出每组里面最小ID,将数据再将最小ID插入:

 INSERT INTO [Per_CheckIn]
        SELECT  [pid],
                [pname],
                [nation],
                [addr],
                [checktime],
                [uptime],
                [Birthday],
                [StartDate],
                [EndDate],
                [Organ],
                [Photo]
        FROM    #tmp a
        WHERE   id IN ( SELECT  MIN(id)
                        FROM    #tmp b
                        WHERE   a.pid = b.pid
                                AND a.checktime = b.checktime
                        GROUP BY pid,checktime );

4.删除临时表,完成操作:

DROP TABLE #tmp;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值