删除除每个日期的最小StatementID之外的所有重复项。
删除除每个日期的最小StatementID之外的所有重复项。
我的代码有一个缺陷,导致了同一笔收费出现了多个重复的记录。它们具有相同的ResidentID和PostedOn日期,但是不同的IDs和StatementIDs。
我有一个很长的ResidentIDs列表,其中有许多日期上的重复项。如何删除除ResidentID的每个唯一日期中StatementID最低的行以外的所有行?
例如:ResidentID为3456的住户将返回StatementID为13和23的记录。
这是在SQL Server的tsql中,删除语句是如何工作的呢?我有:
DELETE FROM Statements
FROM (SELECT *,
ROW_NUMBER()
OVER (
PARTITION BY ResidentID, PostedON
ORDER BY StatementID
) seq
FROM Statements
) s
INNER JOIN person p ON s.ResidentID = p.ID
WHERE seq > 1
AND p.FacilityID = 7
AND p.id = 1316
但是它似乎删除了该表中的所有内容。我错了吗?
问题的原因:在给定的表中,StatementID是一个重复的字段,而我们需要删除除了每个日期中最小的StatementID以外的所有重复记录。因此,我们需要找到解决此问题的方法。
解决方法:通过使用row_number()函数,我们可以为每个日期和ResidentID组合确定每个重复记录的序列号。然后,我们可以删除序列号大于1的记录,以保留每个日期中最小的StatementID。
使用以下代码来解决问题:
delete t from (select *, row_number() over (partition by ResidentID, PostedON order by StatementID) seq from table ) t where seq > 1;
以上代码首先使用select语句创建一个临时表t,该表包含了在每个日期和ResidentID组合中StatementID的序列号。然后,我们使用delete语句从原始表中删除序列号大于1的记录,以达到删除除了每个日期中最小的StatementID以外的所有重复记录的目的。
这就是解决这个问题的方法。希望对你有所帮助!