删除除每个日期的最小StatementID之外的所有重复项。

16 浏览
0 Comments

删除除每个日期的最小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

但是它似乎删除了该表中的所有内容。我错了吗?

0
0 Comments

问题的原因:在给定的表中,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以外的所有重复记录的目的。

这就是解决这个问题的方法。希望对你有所帮助!

0