用SQL语句删除重复数

把图1的PosNum重复项删除,但又不能把CardNo数据也删除了,因为PosNum和CardNo的数据都有相同,CardNo为卡号不能全部删除,只要把图1变成图2这样就行了

--声明变量
Declare @ID Int, @PosNo Int
Declare @Table Table(
ID Int,
PosNo int
)
Declare cur Cursor Static READ_ONLY For
Select ID, PosNo
From 表
Order By EmpID, ID
Open cur
Fetch From cur Into @ID, @PosNo
While @@FETCH_STATUS = 0
Begin
If Exists(Select * From @Table Where PosNo = @PosNo)
Begin
Delete 表 Where ID = @ID
End
Else
Begin
Insert Into @Table (ID, PosNo)
Values (@ID, @PosNo)
End

Fetch Next From cur Into @ID, @PosNo
End
Close cur
DeAllocate cur追问

这是什么啊,重复记录和不重复的记录全部删除了

追答

你那ID不是主键么。。如果不是where条件得换下,游标单条单条数据处理的

追问

主要是删除POSNUM的重复项,但又不能把其他cadrno的也删除,比如907和304里的POSNUM都有64的重复,我要907和304里POSNUM的64都要保留一个

追答

--少一个限定条件,加个EmpID就可以了
Declare @ID Int, @PosNo Int, @EmpID Int
Declare @Table Table(
ID Int,
PosNo Int,
EmpID Int
)
Declare cur Cursor Static READ_ONLY For
Select ID, PosNo, EmpID
From 表
Order By EmpID, ID
Open cur
Fetch From cur Into @ID, @PosNo, @EmpID
While @@FETCH_STATUS = 0
Begin
If Exists(Select * From @Table Where PosNo = @PosNo And EmpID = @EmpID)
Begin
Delete 表 Where ID = @ID
End
Else
Begin
Insert Into @Table (ID, PosNo, EmpID)
Values (@ID, @PosNo, @EmpID)
End
Fetch Next From cur Into @ID, @PosNo, @EmpID

追问

可以了, 感谢啊,能加个好友吗?还有其他的想请教下

追答

私信百度账号chh56983

追问

我想在这段语加入时间段,在哪加入?cardtime between '2012-01-01 00:01' and '2015-12-29 23:50'
cardtime为时间段列,要怎么改?

温馨提示:内容为网友见解,仅供参考
第1个回答  2019-02-18
也就是一列数据完全相同时才删?对不对?
sql语句中distinct是可以去重的。或者用group by,但前者更简单,你琢磨一下,有不懂的再问吧!
第2个回答  2019-02-18
select *
from (
select a.*,row_number() over (parition by Empid,CardNO,MACHNO,POSNUM,type order by id desc) rn
from table_name a
) t
where rn<=1追问

'parition' 附近有语法错误。

追答

partition

追问

不行重复项还是在

第3个回答  2019-02-18
百度SQL去重
相似回答