SQL server去重

transactor 2020-10-25 10:23:37
有一表data里面的数据有部分是重复的,我想把重复的删除只保留一条,如何实现?
...全文
858 13 打赏 收藏 举报
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_291778271 2020-11-18
group by
  • 打赏
  • 举报
回复
qq_291778271 2020-11-13
加1个字段,这个字段负uuid,取最小kcardno的uuid,删除这个uuid
  • 打赏
  • 举报
回复
morliz子轩 2020-11-11
引用 7 楼 transactor 的回复:
kcardno是ID号,k0701是原始的时间记录,每个ID号可以有多条记录,但K0701的时间不能有重复。CREATETIME是写入表的时间,写入表的时候重复写了两次,造成有K0701两条记录是相同的,现在想只保留其中一条。
看明白了,用这个循环就能清理掉。

DECLARE @Count INT 
select @Count=COUNT(kcardno) from data group by kcardno
  having count(*) > 1
PRINT @Count

WHILE(@Count>1)
BEGIN
    DELETE FROM data
    WHERE kcardno in 
    (
    select MAX(kcardno) kcardno from data group by kcardno
      having count(*) > 1
    )  
    SET @Count=@Count-1
END
可以先用个测试数据表,做下测试。
  • 打赏
  • 举报
回复
wswqg0 2020-11-09
用distinct select distinct * into #temp from TestTable delete TestTable go insert TestTable select * from #temp go drop table #temp
  • 打赏
  • 举报
回复
wwfxgm 2020-10-30
引用 9 楼 qq_25073223 的回复:
数据库的三种去重方法,分享给你 在sqlserver数据库下绝对够用,
确实够用了,学习。
  • 打赏
  • 举报
回复
qq_25073223 2020-10-29
数据库的三种去重方法,分享给你 在sqlserver数据库下绝对够用,
  • 打赏
  • 举报
回复
transactor 2020-10-29
引用 3 楼 morliz子轩 的回复:
[quote=引用 楼主 transactor 的回复:]有一表data里面的数据有部分是重复的,我想把重复的删除只保留一条,如何实现?


你这里有两个问题,没有明确。
1、kcardno相同的时候,是将所有k0701中datetime类型相同的删除,还是说只保留日期最新日期的一条记录。
2、createtime是创建记录时的datetime,是保留这个日期为最新的记录,还是怎样

问题要写明白,你才知道怎么处理[/quote]

kcardno是ID号,k0701是原始的时间记录,每个ID号可以有多条记录,但K0701的时间不能有重复。CREATETIME是写入表的时间,写入表的时候重复写了两次,造成有K0701两条记录是相同的,现在想只保留其中一条。
  • 打赏
  • 举报
回复
transactor 2020-10-29
引用 1 楼 吉普赛的歌 的回复:
你红线框的那一列,数据也不是完全相同啊。

举一个数据完全相同(a,b 两列重复),如何删除去重的方法:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(
a INT,
b INT,
c INT
)
GO
INSERT INTO t VALUES (1,2,3)
INSERT INTO t VALUES (1,2,3)
INSERT INTO t VALUES (1,2,6)
INSERT INTO t VALUES (2,3,4)
INSERT INTO t VALUES (2,3,5)
INSERT INTO t VALUES (3,1,2)

;WITH cte AS (
SELECT ROW_NUMBER() OVER (PARTITION BY a,b ORDER BY c) AS rid,*
FROM t
)
SELECT * FROM cte WHERE rid=1
/*
rid a b c
1 1 2 3
1 2 3 4
1 3 1 2
*/

;WITH cte AS (
SELECT ROW_NUMBER() OVER (PARTITION BY a,b ORDER BY c) AS rid,*
FROM t
)
DELETE FROM cte WHERE rid>1


SELECT * FROM t
/*
a b c
1 2 3
2 3 4
3 1 2
*/


K0701这列的数据都有两条记录是一样的,现在只想保留一条
  • 打赏
  • 举报
回复
RINK_1 2020-10-29
SELECT * FROM (SELECT *,ROW_NUMBER() OVER (PARTITION BY KCARDNO,K0701 ORDER BY CREATETIME) AS SEQ FROM TABLE) AS A WHERE SEQ>1
  • 打赏
  • 举报
回复
xiaoxiangqing 2020-10-26
ROW_NUMBER编号再去重
  • 打赏
  • 举报
回复
morliz子轩 2020-10-26
引用 楼主 transactor 的回复:
有一表data里面的数据有部分是重复的,我想把重复的删除只保留一条,如何实现?
你这里有两个问题,没有明确。 1、kcardno相同的时候,是将所有k0701中datetime类型相同的删除,还是说只保留日期最新日期的一条记录。 2、createtime是创建记录时的datetime,是保留这个日期为最新的记录,还是怎样 问题要写明白,你才知道怎么处理
  • 打赏
  • 举报
回复
qq_37753824 2020-10-26
加个自增列,delete from table1 where exists(select 1 from table1 a where a.Id>table1.Id and 条件)
  • 打赏
  • 举报
回复
吉普赛的歌 2020-10-25
你红线框的那一列,数据也不是完全相同啊。 举一个数据完全相同(a,b 两列重复),如何删除去重的方法:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL
DROP TABLE t
GO
CREATE TABLE t(
	a INT,
	b INT,
	c INT	
)
GO
INSERT INTO t VALUES (1,2,3)
INSERT INTO t VALUES (1,2,3)
INSERT INTO t VALUES (1,2,6)
INSERT INTO t VALUES (2,3,4)
INSERT INTO t VALUES (2,3,5)
INSERT INTO t VALUES (3,1,2)

;WITH cte AS (
	SELECT ROW_NUMBER() OVER (PARTITION BY a,b ORDER BY c) AS rid,*	
	FROM t
)
SELECT * FROM cte WHERE rid=1
/*
rid	a	b	c
1	1	2	3
1	2	3	4
1	3	1	2
*/

;WITH cte AS (
	SELECT ROW_NUMBER() OVER (PARTITION BY a,b ORDER BY c) AS rid,*	
	FROM t
)
DELETE FROM cte WHERE rid>1


SELECT * FROM t
/*
a	b	c
1	2	3
2	3	4
3	1	2
*/
  • 打赏
  • 举报
回复
发帖
应用实例

2.7w+

社区成员

MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
帖子事件
创建了帖子
2020-10-25 10:23
社区公告
暂无公告