在 SQL 服务器 Table 中查找重复项
Find Duplicates in SQL Server Table
不知何故,我的 table 中有重复的条目。数据结构是这样设置的:
RecordID, UserID, clockin, clockout
因此,如果一个用户有 2 个条目具有相同的 clockin/clockout
时间,则它是重复的。副本看起来像这样。 entry应该只存在一次,clockin & clock
out时间完全一样
RecordID UserID clockin clockout
1 16 2015-01-12 07:15:23 2015-01-12 08:55:15
2 16 2015-01-12 07:15:23 2015-01-12 08:55:15
3 44 2014-12-18 08:02:36 2014-12-18 04:02:36
4 44 2014-12-18 08:02:36 2014-12-18 04:02:36
首先,您需要找到重复的记录并删除它们,UserId
、clockin
、clockout
值的每个组合只留下一条记录。
DELETE
FROM MyTable
WHERE RecordId IN(
SELECT t1.RecordId
FROM MyTable t1
INNER JOIN MyTable t2 ON(t1.UserId = t2.UserId
AND t1.clockin = t2.clockin
AND t1.clockout = t2.clockout)
WHERE t1.RecordId < t2.RecordId
)
那么你应该在这 3 列的组合上设置一个 unique constraint or unique index,这样 Sql 服务器将阻止你输入重复的数据。
具有row_number
window功能:
with cte as(select *, row_number() over(partition by UserID, clockin, clockout
order by RecordID ) as rn from TableName)
delete from cte where rn > 1
不知何故,我的 table 中有重复的条目。数据结构是这样设置的:
RecordID, UserID, clockin, clockout
因此,如果一个用户有 2 个条目具有相同的 clockin/clockout
时间,则它是重复的。副本看起来像这样。 entry应该只存在一次,clockin & clock
out时间完全一样
RecordID UserID clockin clockout
1 16 2015-01-12 07:15:23 2015-01-12 08:55:15
2 16 2015-01-12 07:15:23 2015-01-12 08:55:15
3 44 2014-12-18 08:02:36 2014-12-18 04:02:36
4 44 2014-12-18 08:02:36 2014-12-18 04:02:36
首先,您需要找到重复的记录并删除它们,UserId
、clockin
、clockout
值的每个组合只留下一条记录。
DELETE
FROM MyTable
WHERE RecordId IN(
SELECT t1.RecordId
FROM MyTable t1
INNER JOIN MyTable t2 ON(t1.UserId = t2.UserId
AND t1.clockin = t2.clockin
AND t1.clockout = t2.clockout)
WHERE t1.RecordId < t2.RecordId
)
那么你应该在这 3 列的组合上设置一个 unique constraint or unique index,这样 Sql 服务器将阻止你输入重复的数据。
具有row_number
window功能:
with cte as(select *, row_number() over(partition by UserID, clockin, clockout
order by RecordID ) as rn from TableName)
delete from cte where rn > 1