[英]MS SQL 2008 : Delete “duplicates” to select most recent results using multiple columns with no PK
我有一个看起来像这样的表,我需要删除重复项以获取最新结果。 这些不是您的标准重复项,因为没有主键或另一列,您没有在其中计算相同值的相同实例。 该表列出了已注册球员的名单,以及他们加入和离开球队的日期。 如果EndDate列为Null,则表示该球员仍在为该球队效力。
PlayerID | RegID | RegDate | EndDate | Team | LastUpdate |
1 ---------| 1 ------| 10/12/13 | 10/16/13 | Red -- | 10/16/13 -- |
1 ---------| 2 ------| 10/17/13 | null ------ | Blue -- | 10/23/13 -- |
1 ---------| 3 ------| 10/17/13 | null ------ | Green -- | 10/23/13 -- |
什么是重复项? 如果玩家ID在EndDate列中具有多个空记录。 然后,我们只想检索带有空EnDate的记录,该记录最后在“ LastUpdade”列上更新,并且如果它们具有相同的LastUpated值,则采用RegistrationID列的最大值。
这应该给我们显示以下行的结果:
在这种情况下,我们将检索第1行和第3行,因为第1行在EndDate中没有空值,而第3行因为LastUpdateON与第2行相同,但是其RegID高于第2行。
我尝试使用LastUpdated DESC和RegDate DESC的CTE和Partition By命令排序,但是没有得到正确的结果。
可以使用CTE完成此操作吗(如果可以的话),还是应该通过创建另一个表来完成(如果可以的话)?
非常感谢您为我提供的任何帮助。 照顾自己!
您可以使用row_number()
进行此操作:
select t.*
from (select t.*,
row_number() over (partition by PlayerId, EndDate
order by lastupdate desc, registrationid desc
) as seqnum
from table t
) t
where EndDate is not NULL or seqnum = 1;
枚举组中的行。 在这种情况下,该组由PlayerId
和EndDate
组合定义。 因此,一个玩家的所有NULL
值都在一个组中。 第一个值是具有最高的lastupdate
日期,然后是最高的注册ID的值。 外部where
记录具有有效EndDate
或组中第一记录的所有记录。
您是只想返回这些值还是要实际删除其他值,这个问题有点模棱两可。 幸运的是,SQL Server具有可更新的CTE,因此您可以使用非常相似的逻辑从表中删除记录:
with todelete as (
select t.*,
row_number() over (partition by PlayerId, EndDate
order by lastupdate desc, registrationid desc
) as seqnum
from table t
) t
delete from todelete
where EndDate is NULL and seqnum > 1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.