繁体   English   中英

MS SQL 2008:使用多个没有PK的列删除“重复项”以选择最新结果

[英]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;

枚举组中的行。 在这种情况下,该组由PlayerIdEndDate组合定义。 因此,一个玩家的所有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM